2015-01-06 15 views
4

WebAPI 컨트롤러 동작에 [Authorize] 속성을 사용하고 있으며 항상 권한이 다시 돌아옵니다.웹 API 권한 부여 작업이 작동하지 않습니다.

는 여기가 글로벌에 messageHandler의 권한을 설정하고 위치를

다음
[Authorize(Roles = "Admin")] 
    public IQueryable<Country> GetCountries() 
    { 
     return db.Countries; 
    } 

은 내 작업입니다. 이것은 테스트 사용자를위한 테스트 용입니다.

public class AuthenticationHandler1 : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(
     HttpRequestMessage request, CancellationToken cancellationToken) 
    { 

     if (!HttpContext.Current.User.Identity.IsAuthenticated) 
     { 
      HttpContext.Current.User = TestClaimsPrincipal(); 
     } 


     return base.SendAsync(request, cancellationToken); 
    } 

    private ClaimsPrincipal TestClaimsPrincipal() 
    { 

     var identity = new ClaimsIdentity(HttpContext.Current.User.Identity.AuthenticationType); 
     identity.AddClaim(new Claim(ClaimTypes.Name, "some.user")); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Admin")); 
     identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor")); 
     var testIdentity = new ClaimsIdentity(identity); 

     var myPrincipal = new ClaimsPrincipal(testIdentity); 

     return myPrincipal; 
    } 
} 

그것은 내가 사용자 정의 인증 속성을 만들어 그것을 작동 메시지

{"Message":"Authorization has been denied for this request."} 
+0

처럼 사용하여 권한 부여 특성에 내장 나는 정의를 만들 필요가 없습니다 –

답변

2

이 보여주는 계속 Application_Start

GlobalConfiguration.Configuration.MessageHandlers.Add(new MyProject.AuthenticationHandler1()); 

Global.asax.cs에 등록.

public class AuthorizationAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    public string Roles { get; set; } 
    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     ClaimsPrincipal currentPrincipal = HttpContext.Current.User as ClaimsPrincipal; 
     if (currentPrincipal != null && CheckRoles(currentPrincipal)) 
     { 
      return true; 
     } 
     else 
     { 
      actionContext.Response = 
       new HttpResponseMessage(
       System.Net.HttpStatusCode.Unauthorized) 
       { 
        ReasonPhrase = "Some message" 
       }; 
      return false; 
     } 
    } 

    private bool CheckRoles(ClaimsPrincipal principal) 
    { 
     string[] roles = RolesSplit; 
     if (roles.Length == 0) return true; 
     return roles.Any(principal.IsInRole); 
    } 

    protected string[] RolesSplit 
    { 
     get { return SplitStrings(Roles); } 
    } 

    protected static string[] SplitStrings(string input) 
    { 
     if(string.IsNullOrWhiteSpace(input)) return new string[0]; 
     var result = input.Split(',').Where(s=>!String.IsNullOrWhiteSpace(s.Trim())); 
     return result.Select(s => s.Trim()).ToArray(); 
    } 
} 

은 또한이 같은 문제가있어이

[AuthorizationAttribute(Roles = "SomeRole,Admin")]  
public IQueryable<Country> GetCountries() 
    { 
    } 
관련 문제