.net core에서 액세스 제어층의 실현
일반적인 프로그램의 경우 로그인하지 않은 상황에서 대응하는 권한이 없으면 대응하는 페이지에 접근할 수 있어야 하며, 서로 다른 사용자도 이 사용자의 권한이 조건에 부합되는지 검증해야 한다.
백엔드 서비스에 대해 말하자면 중간층이 차단하여 대응하는 http 요청이 권한 요구에 부합되는지 검증해야 한다.
Middleware-요청 파이프라인을 사용합니다. 사용자 정의 중간부품을 통해 Http 요청을 차단하고 관련 검증을 실현합니다.
Middleware-청구 파이프의 원리와 해석은 이 문장을 참고할 수 있다. Middleware-청구 파이프의 구성
논리를 실현하다
사용자가 로그인에 성공하면 저희는 서버에서 자동으로
Token
를 생성합니다. 이Token
는 대응하는 권한을 연결하고 Redis에 저장합니다.저희가 정의한 중간층은 요청을 차단합니다. 요청 중의
Token
이 합법적인지 확인하고, 합법적이지 않으면 이 요청을 차단합니다.UseMiddleware
확장 방법을 사용하여 차단된HttpContext
을 상응하는 논리 처리를 한다.세부 코드
우선 권한 제어의 중간부품을 사용자 정의합니다.
SecurityMiddleware
클래스는 우리의 구체적인 논리적 실현입니다.public static IApplicationBuilder UseSecurity(this IApplicationBuilder builder)
{
return builder.UseMiddleware();
}
Startup.cs
의 Configure
방법에서 사용자 정의 중간부품을 추가합니다.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의 운행 원리는 당신이 원하는 방법을 더욱 잘 실현할 수 있도록 합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.