0

그래서 .NET Core [Authorize] 특성을 고수하는 데 어려움을 겪고 있습니다.외부 JWT 인증 마이크로 서비스를 사용하는 .NET Core Authorize 속성?

내가 실행하는 인증 서비스를 가지고 JWT를 반환합니다 유효한 인증 정보와 함께 제공되는 경우 (의이 authapi.com을 가정 해 봅시다). 이 JWT가 다시 주어지면 JWT의 유효성을 확인하고이를 나타내는 메시지를 반환합니다.

그래서, 지금 또 다른 WebAPI를 짓고 있어요 액션/컨트롤러 중 일부에 대한 권한을 필요로하는 (의는 genericapi.com을 가정 해 봅시다). 아이디어의 존재는 JWT는 다음을 확인하려면 authapi.com에에서 사람들을 전달해야 genericapi에 대한 요청의 헤더에 전달됩니다.

나는 정책을 추가하는 시도하지만 정말 빠른 뒤얽힌있어, 난 차라리 그냥 기본 [Authorize] 이런 짓을 줄 때 모든 권한이 authapi을 쳐야하기 때문에, 모든 것에 [Authorize(Policy="TokenValid")]를 작성했다.

헤더에서 JWT를 가져 와서 authapi에 전달하면 [Authorize]의 표준 동작으로 어떻게 될까요?

마음에 든다 : 나는 genericapi에있는 JWT로 아무것도하고 싶지 않다. 모든 인증은 authapi으로 처리되어야한다.

답변

2

당신은 사용자 정의 ISecurityTokenValidator에 제공하는 기본 JwtBearerAuthenticationMiddleware을 사용자 정의하려고 할 수 있습니다. 귀하의 사용자 ID가 자동으로 미들웨어에 의해 설정 될 것입니다, 당신은 MVC 내부의 Authorize 속성을 계속 사용할 수 있습니다 :

class MyTokenValidator : ISecurityTokenValidator 
{ 
    public string AuthenticationScheme { get; } 

    public MyTokenValidator(string authenticationScheme) 
    { 
     AuthenticationScheme = authenticationScheme; 
    } 

    public bool CanValidateToken => true; 

    public int MaximumTokenSizeInBytes 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
     set 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public bool CanReadToken(string securityToken) => true; 

    public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) 
    { 
     validatedToken = null; 

     //your logic here 
     var response = GetResponseFromMyAuthServer(securityToken); 
     //assuming response will contain info about the user 

     if(response == null || response.IsError) 
      throw new SecurityTokenException("invalid"); 

     //create your identity by generating its claims 
     var claims = new[] 
     { 
      new Claim(ClaimTypes.NameIdentifier, response.UserId), 
      new Claim(ClaimTypes.Email, response.Email), 
      new Claim(ClaimsIdentity.DefaultNameClaimType, response.UserName), 
     }; 

     return new ClaimsPrincipal(new ClaimsIdentity(claims, AuthenticationScheme)); 
    } 
} 

그리고 시동 클래스 :

var options = new JwtBearerOptions(); 
options.SecurityTokenValidators.Clear(); 
options.SecurityTokenValidators.Add(new MyTokenValidator(options.AuthenticationScheme)); 

app.UseJwtBearerAuthentication(options); 

//the rest of your code here 
app.UseMvc(); 

당신은 더이 방법을 수정해야 할 수도 있습니다를 이 방법을 사용하면 모든 유효성 검사를 원격 끝점에 위임하여 필요한 것을 얻을 수 있습니다.

1

는 지금까지 내가 이해 당신은 genericapiJwtBearerAuthentication를 사용하지 않습니다. 이 경우 사용자 정의 인증 미들웨어 (authapi에 JWT를 보내고 그 다음 설정 현재 사용자를 확인) genericapi을 위해 쓸 수 있습니다. 그런 다음 [Authorize] 속성을 사용하십시오.

, 나는 당신의 방법으로 갈 것입니다 가능하면 사용자 정의 인증 미들웨어 https://stackoverflow.com/a/37415902/5426333

그러나을 살펴 쓰기합니다. genericapiJwtBearerAuthentication을 사용합니다. 그런 다음 OnTokenValidated 이벤트를 사용하여 다른 유효성 검사를 처리합니다.

 app.UseJwtBearerAuthentication(new JwtBearerOptions() 
     { 
      Events = new JwtBearerEvents() 
      { 
       OnTokenValidated = (context) => 
       { 
        // send jwt to auth api 
        // validate it 
        if (!valid) 
        { 
         context.SkipToNextMiddleware(); 
        } 
        return Task.FromResult(0); 
       } 
      } 
     }); 
+0

실제로 당신은 내가 뭘했는지 거의 못 잡았고, 나는 JwtBearerAuthentication이하는 일을 오해했다고 생각합니다. 나는 그것을 다른 것을 통해 지금 보게 될 것이고 볼 것이다. – SamBC

관련 문제