2016-09-22 1 views
1

ASP.Net Framework에서 ASP.Net Core로 이동 중입니다.ASP.Net 코어에서 AuthorizeAttribute를 무시하고 Json 상태에 응답하십시오.

웹 API이 프로젝트와 ASP.Net 프레임 워크에서

,이 같은 AuthorizeAttribute을 사용자 정의 할 수 있습니다

public class ApiAuthorizeAttribute : AuthorizationFilterAttribute 
{ 
    #region Methods 

    /// <summary> 
    ///  Override authorization event to do custom authorization. 
    /// </summary> 
    /// <param name="httpActionContext"></param> 
    public override void OnAuthorization(HttpActionContext httpActionContext) 
    { 
     // Retrieve email and password. 
     var accountEmail = 
      httpActionContext.Request.Headers.Where(
        x => 
         !string.IsNullOrEmpty(x.Key) && 
         x.Key.Equals("Email")) 
       .Select(x => x.Value.FirstOrDefault()) 
       .FirstOrDefault(); 

     // Retrieve account password. 
     var accountPassword = 
      httpActionContext.Request.Headers.Where(
        x => 
         !string.IsNullOrEmpty(x.Key) && 
         x.Key.Equals("Password")) 
       .Select(x => x.Value.FirstOrDefault()).FirstOrDefault(); 

     // Account view model construction. 
     var filterAccountViewModel = new FilterAccountViewModel(); 
     filterAccountViewModel.Email = accountEmail; 
     filterAccountViewModel.Password = accountPassword; 
     filterAccountViewModel.EmailComparision = TextComparision.Equal; 
     filterAccountViewModel.PasswordComparision = TextComparision.Equal; 

     // Find the account. 
     var account = RepositoryAccount.FindAccount(filterAccountViewModel); 

     // Account is not found. 
     if (account == null) 
     { 
      // Treat the account as unthorized. 
      httpActionContext.Response = httpActionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 

      return; 
     } 

     // Role is not defined which means the request is allowed. 
     if (_roles == null) 
      return; 

     // Role is not allowed 
     if (!_roles.Any(x => x == account.Role)) 
     { 
      // Treat the account as unthorized. 
      httpActionContext.Response = httpActionContext.Request.CreateResponse(HttpStatusCode.Forbidden); 

      return; 
     } 

     // Store the requester information in action argument. 
     httpActionContext.ActionArguments["Account"] = account; 
    } 

    #endregion 

    #region Properties 

    /// <summary> 
    ///  Repository which provides function to access account database. 
    /// </summary> 
    public IRepositoryAccount RepositoryAccount { get; set; } 

    /// <summary> 
    ///  Which role can be allowed to access server. 
    /// </summary> 
    private readonly byte[] _roles; 

    #endregion 

    #region Constructor 

    /// <summary> 
    ///  Initialize instance with default settings. 
    /// </summary> 
    public ApiAuthorizeAttribute() 
    { 
    } 

    /// <summary> 
    ///  Initialize instance with allowed role. 
    /// </summary> 
    /// <param name="roles"></param> 
    public ApiAuthorizeAttribute(byte[] roles) 
    { 
     _roles = roles; 
    } 

    #endregion 
} 

을 내 사용자 정의 AuthorizeAttribute에서, 내가 계정이 유효한지 여부를 확인 여부 및 클라이언트에 메시지를 HttpStatusCode를 반환 할 수 있습니다 .

ASP.Net Core에서 아무 것도하지 않으려 고하지만 OnAuthorization을 사용하지 않아도됩니다.

ASP.Net Framework에서와 동일한 작업을 어떻게 수행 할 수 있습니까?

감사합니다.

답변

5

잘못 접근하고 있습니다. 이 작업을 위해 사용자 지정 특성을 작성하거나 기존 특성을 확장하는 것이 결코 권장되지 않았습니다. ASP.NET 코어 역할은 이전 버전과의 호환성을 위해 아직 시스템에서 떨어져 있지만 지금은 사용하지 않는 것이 좋습니다.

일부 드라이빙 아키텍처 변경 사항에 대해 훌륭한 두 부분으로 구성된 시리즈와이를 활용해야하는 방식은 here입니다. 여전히 역할에 의존하고 싶다면 정책을 사용하는 것이 좋습니다.

는 정책은 다음과 와이어 :
public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddAuthorization(options => 
    { 
     options.AddPolicy(nameof(Policy.Account), 
          policy => policy.Requirements.Add(new AccountRequirement())); 
    }); 
} 

나는 편의를 위해 Policy 열거를 만들었습니다. 같은

public enum Policy { Account }; 

장식 진입 점 :

[ 
    HttpPost, 
    Authorize(Policy = nameof(Policy.Account)) 
] 
public async Task<IActionResult> PostSomething([FromRoute] blah) 
{ 
} 

AccountRequirement 그냥 자리 표시 자입니다, 그것은 IAuthorizationRequirement 인터페이스를 구현해야합니다.

public class AccountRequirement: IAuthorizationRequirement { } 

이제 핸들러를 만들고이를 DI에 연결하기 만하면됩니다.

public class AccountHandler : AuthorizationHandler<AccountRequirement> 
{ 
    protected override async Task HandleRequirementAsync(
     AuthorizationHandlerContext context, 
     AccountRequirement requirement) 
    { 
     // Your logic here... or anything else you need to do. 
     if (context.User.IsInRole("fooBar")) 
     { 
      context.Succeed(requirement); 
      return; 
     } 
    } 
} 

추가 자료

+0

내가 헤더에서 access_token은을 얻기 위해 HttpRequest를 구문 분석하려면? 왜냐하면 나는 GitHub OAuth, Google OAuth 및 Facebook OAuth를 내 스스로 구현하려고하기 때문입니다. 타사 라이브러리는 사용하기 복잡합니다. – Redplane

+0

문제가되지 않습니다.이 코드를 설정하고'AuthorizationHandlerContext context' 변수를 검사하십시오. 헤더와 루타타 (routedata)가있는'HttpRequest'가 있음을 알게 될 것입니다. –

+0

실제로 HttpRequest가 보이지 않습니다. 여기에 내 이미지가 있습니다 : http://www.mediafire.com/view/c1bv86ktb16qqjj/Screenshot_%2815%29.png – Redplane