2017-11-10 2 views
1

클라이언트에 액세스 토큰을 제공하는 Identityserver4가 있습니다.identityserver3.accesstokenvalidation을 사용하여 특정 역할에 API에 액세스하는 방법

내 API에서이 사용자에게 API 액세스 권한을 부여하기 전에 클라이언트가 특정 범위에 액세스 할 수 있고 특정 역할에 속하는지 확인하고 싶습니다.

이렇게하려면 Identityserver3.accesstokenvalidation 패키지를 사용하고 있습니다.

app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
     { 
      Authority = "Authority", 
      RequiredScopes = new[] { "MyScope" }, 
     }); 

이 또한 제공되는 범위는 "마이 스코프는"인 경우 확인하고 있습니다, 내 API에 액세스 액세스 토큰이없는 사용자를 차단하고 있습니다.

제 질문은 API에 대한 액세스를 허용하기 전에 사용자에게 특정 역할이 있는지 확인하는 방법입니다.

답변

2

특정 컨트롤러에 대해 [Authorize(Roles = "Admin")] 속성을 지정할 수 있습니다. 소유권 주장에 고급 로직이 필요한 경우 자신의 속성을 지정해야합니다. AuthorizePermissionAttribute 컨트롤러 [AuthorizePermission("Preview")]와 함께 사용 :

public class AuthorizePermissionAttribute : AuthorizeAttribute 
{ 
    private readonly string grantedPermission; 

    public AuthorizePermissionAttribute(string permission) 
    { 
     this.grantedPermission = permission ?? throw new ArgumentNullException(nameof(permission)); 
    } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     var claims = actionContext.ControllerContext.RequestContext.Principal as ClaimsPrincipal; 

     var permission = claims?.FindFirst(this.grantedPermission); 

     return permission != null && Convert.ToBoolean(permission.Value); 
    } 

    protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) 
    { 
     var response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "insufficient_permissions"); 

     actionContext.Response = response; 
    } 
} 

은 또한 당신은 Startup.cs에 넣어해야합니다 항상 무단 상태 코드를 반환합니다

JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 

    app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions 
    { 
     Authority = ConfigurationManager.AppSettings["IdentityProviderApi"], 
     PreserveAccessToken = true 
    }); 

JwtSecurityTokenHandler.InboundClaimTypeMap없이.

+0

답변을 주셔서 감사합니다. 컨트롤러가 역할을 확인하는 데이 클래스를 사용해야한다는 것을 컨트롤러가 어떻게 이해할 수 있습니까? [AuthorizePermission ("Preview")] 란 무엇입니까? 약간의 설명을 추가 할 수 있습니까? –

+0

보호하려는 컨트롤러에 대해 [Authorize (Roles = "Admin")]을 사용할 수 있습니다 (이 논리는 .NET의 AuthorizeAttribute에서 제공됨). [AuthorizePermission ("Preview")]보다 고급 로직이 필요한 경우 예를 들어 자신의 속성을 사용하는 방법에 대한 예입니다. 사용 권한을 확인합니다. –

+0

감사합니다 .. 나는 이미 [Authorize (Roles = "Admin")]를 사용했지만 access_token에 역할이 포함되어 있어도 모든 요청을 차단합니다. 사용자 답장으로 사용자가 –

관련 문제