2016-11-27 20 views
0

ログインページから外部APIを使用してユーザーを認証する必要があります。外部APIからの認証が成功すると、セッションにAuthTokenを保存します。要求は、私は、次の認証ハンドラASP.Netコアのカスタム認証メカニズム

public class ExtApiStoreRequirement : IAuthorizationRequirement 
{ 
} 
public class ExtApiAuthorizationHandler : AuthorizationHandler<ExtApiStoreRequirement> 
{ 

    IHttpContextAccessor _accessor; 
    public ExtApiAuthorizationHandler(IHttpContextAccessor accessor) 
    { 
     _accessor = accessor; 
    } 

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ExtApiStoreRequirement requirement) 
    { 
     var authState = GET_AUTH_FROM_SESSION(_accessor.HttpContext.Session); 


     if (authState!=null) 
     { 
      _accessor.HttpContext.Response.Redirect("/Account/Login"); 
      //context.Fail(); <-- I removed that because it was responding an empty page 
      context.Succeed(requirement); 
     } 
     else 
      context.Succeed(requirement); 

     return Task.CompletedTask; 
    } 
} 

を有効作成していると私は私のstartup.cs

services.AddAuthorization(options => 
     { 
      options.AddPolicy("ExtApi", 
           policy => policy.Requirements.Add(new ExtApiStoreRequirement())); 
     }); 

でこのアプローチを、このハンドラを登録しているかどうかをチェックするために

は作業が、私ドンれます私はリダイレクションのためにcontext.Succeed(requirement);に電話をしなければならないので、自信を持って感じることはできません。私がcontext.Fail()と呼ぶと、リダイレクトは起こらず、私が見るのは空のページだけです。

この方法でセキュリティ上の問題はありますか?安全に使用できますか?

答えて

0

あなたの実装は認証ではなく認証です。私は、認証ポリシーを作成する代わりに、カスタム認証ミドルウェアを作成することがあなたのケースに適していると思います。

protected override async Task<AuthenticateResult> HandleAuthenticateAsync() 
{ 
    AuthenticateResult result = null; 
    var principal = GetPrincipalFromSession(); 
    if(principal != null) 
    { 
     result = AuthenticateResult.Success(new AuthenticationTicket(principal, 
        new AuthenticationProperties(), Options.AuthenticationScheme)); 
    } 
    else 
    { 
     result = AuthenticateResult.Skip(); 
    } 
    return result; 
} 

更新コメントに基づく:

protected override async Task<bool> HandleUnauthorizedAsync(ChallengeContext context) 
{  
    Response.Redirect(Options.LoginPath);// you need to define LoginPath   
    return true; 
} 

まず何か以下のようにする必要がありますあなたのケースHandleAuthenticateAsyncについては、上記の方法を実装するには、カスタム認証Simple token based authentication/authorization in asp.net core for Mongodb datastore

を実装する方法をご覧ください

また、ユーザーがログインするときにプリンシパルを保存する必要があります。

+0

承認されていない場合、ログインページへのリダイレクトはどこにありますか? –

+0

あなたが正しいです、私はこれを逃した。 'HandleUnauthorizedAsync'をリダイレクトに置き換えることができます。私の更新を参照してください。 –