.net core에서 액세스 제어층의 실현

3321 단어 c#asp.net.net-core
전편에 있어요.netcore에서 첨부파일 업로드와 다운로드의 실현에 대해 주로 소개했습니다.netcore에서 파일 업로드와 다운로드에 대한 작업은 권한 검증이 사용자 정의 중간부품을 통해 차단되는 방법을 소개한다.
일반적인 프로그램의 경우 로그인하지 않은 상황에서 대응하는 권한이 없으면 대응하는 페이지에 접근할 수 있어야 하며, 서로 다른 사용자도 이 사용자의 권한이 조건에 부합되는지 검증해야 한다.
백엔드 서비스에 대해 말하자면 중간층이 차단하여 대응하는 http 요청이 권한 요구에 부합되는지 검증해야 한다.
Middleware-요청 파이프라인을 사용합니다. 사용자 정의 중간부품을 통해 Http 요청을 차단하고 관련 검증을 실현합니다.
Middleware-청구 파이프의 원리와 해석은 이 문장을 참고할 수 있다. Middleware-청구 파이프의 구성
논리를 실현하다
사용자가 로그인에 성공하면 저희는 서버에서 자동으로 Token를 생성합니다. 이Token는 대응하는 권한을 연결하고 Redis에 저장합니다.
저희가 정의한 중간층은 요청을 차단합니다. 요청 중의 Token이 합법적인지 확인하고, 합법적이지 않으면 이 요청을 차단합니다.UseMiddleware 확장 방법을 사용하여 차단된HttpContext을 상응하는 논리 처리를 한다.
세부 코드
우선 권한 제어의 중간부품을 사용자 정의합니다. SecurityMiddleware 클래스는 우리의 구체적인 논리적 실현입니다.
public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
    return builder.UseMiddleware();
}
Startup.csConfigure 방법에서 사용자 정의 중간부품을 추가합니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseSwagger();
    app.UseSwaggerUI(c => {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "  API V1");
    });

    app.UseSecurity();//      

    app.UseMvc();
}

다음에 우리는 대응하는 SecurityMiddleware류를 구체적으로 실현하고 대응하는 Invoke방법을 주로 실현한다.
public async Task Invoke(HttpContext context)
{
    string path = context.Request.Path.ToString().ToLower();

    //                  (    ,   )
    if (excludeUrl.Contains(path))
    {
        await _next(context);
        return;
    }

    //   header  token
    string userToken = string.Empty;            
    bool hasValue = context.Request.Headers.TryGetValue(INVOKER_TOKEN_HEADER, out StringValues token);
    if (!hasValue || token.Count == 0)
    {
        //  header   token,    cookie   
        userToken = context.Request.Cookies[USER_TOKEN_COOKIE_NAME];
        if(string.IsNullOrWhiteSpace(userToken))
        {
            // TODO:     ,    
            await CreateUnauthorizedResponse(context);

            return;
        }
    }
    else
    {
        userToken = token[0];
    }

    //     Token Redis         ,    ,      
    var userInfo = await GetUserInfo(userToken);
    if (userInfo == null)
    {
        // TODO:     ,    
        await CreateUnauthorizedResponse(context);
        return;
    }

    //                  
}

참조 Response 메서드:
private static async Task CreateUnauthorizedResponse(HttpContext context)
{
    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    context.Response.ContentType = "application/json;charset=utf-8";

    ResponseResult result = new ResponseResult
    {
        Result = false,
        ErrorMessage = "           ,        。",
        Code = ResponseCode.Unauthorized
    };

    await context.Response.WriteAsync(JsonConvert.SerializeObject(result), Encoding.UTF8);
}

여기까지, 우리가 기본적으로 실현한 대응하는 제어 방문.
총결산
이 편에 대해서 말하자면, 그래도 가서 좀 이해해야 한다.netcore의 운행 원리는 당신이 원하는 방법을 더욱 잘 실현할 수 있도록 합니다.

좋은 웹페이지 즐겨찾기