2017-08-18 8 views
3

、私はプラグインするカスタムAuthenticationHandlerミドルウェアを持っている私のスタートアップでActiveAuthenticationSchemesのデフォルトを設定するにはどうすればよいですか?私のASP.NetのCore 2プロジェクトで

public class BasicAuthenticationMiddleware : AuthenticationHandler<AuthenticationSchemeOptions> 
{ 
    public BasicAuthenticationMiddleware(IOptionsMonitor<AuthenticationSchemeOptions> options, 
     ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
     : base(options, logger, encoder, clock) 
    { 
    } 
    protected override Task<AuthenticateResult> HandleAuthenticateAsync() 
    { 
     var principal = new GenericPrincipal(new GenericIdentity("User"), null); 
     var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), "BasicAuth"); 
     return Task.FromResult(AuthenticateResult.Success(ticket)); 
    } 
} 

私は、次のいます。

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 
    services.AddAuthentication(options => 
    { 
     options.DefaultAuthenticateScheme = "BasicAuth"; 
     options.DefaultChallengeScheme = "BasicAuth"; 
     options.AddScheme("BasicAuth", x => { 
      x.DisplayName = "BasicAuthenticationMiddleware"; 
      x.HandlerType = typeof(BasicAuthenticationMiddleware); 
     }); 
    }); 
} 

そして最後に私の見解コントローラ:

[Route("api/[controller]")] 
public class ValuesController : Controller 
{ 
    // GET api/values/Works 
    [HttpGet] 
    [Route("Works")] 
    [Authorize(ActiveAuthenticationSchemes = "BasicAuth")] 
    public string Works() 
    { 
     return "works"; 
    } 

    // GET api/values/DoesNotWork 
    [HttpGet] 
    [Route("DoesNotWork")] 
    [Authorize] 
    public string DoesNotWork() 
    { 
     return "does not work"; 
    } 

} 
私はSCHEMに ActiveAuthenticationSchemesを指定するときに私のオーセンティケータ HandleAuthenticateAsyncが呼び出されます

eの名前ですが、それ以外の場合はそうなりません。 https://github.com/JohnPAguirre/AuthenticationSchemaProblem

私のBasicAuthenticationMiddlewareに私のデモのロジックでログオンしたいと思っています。 ActiveAuthenticationSchemesをすべての要求に対して「BasicAuth」にするにはどうすればよいですか?

誰かが私が紛失している可能性のあるアイディアはありますか?

+0

パラメータを指定せずに 'Authorize'を実行すると、ユーザーがログインしているかどうかを確認するだけです。正確に何をしたいですか? – DavidG

+0

私のBasicAuthenticationMiddlewareが私のデモロジックで全員をログに記録したいと思っています。どのようにしてActiveAuthenticationSchemesのデフォルトを "BasicAuth"にすることができますか? – JohnAguirre

+0

'BasicAuth"を 'BasicAuthenticationMiddleware'クラスで定数として宣言することをお勧めします。あなたはそれを書いている間にタイプミスをしたくありません。 –

答えて

3

デフォルトを設定することはできませんが、その他のオプションがあります。

  1. 独自のカスタムの許可属性を作成します。前になり

    public class BasicAuthAuthorizeAttribute : AuthorizeAttribute 
    { 
        public BasicAuthAuthorizeAttribute() 
        { 
         ActiveAuthenticationSchemes = "BasicAuth"; 
        } 
    } 
    

    をそして、あなたのようなあなたの行動でそれを使用します。

    [BasicAuthAuthorize] 
    public string SomeAction() 
    { 
        //snip 
    } 
    
  2. のみすべてのあなたの行動とにAuthorize属性を追加します。必要に応じて上書きしてください。

    public void ConfigureServices(IServiceCollection services) 
    { 
        services.AddMvc(options => 
        { 
         options.Filters.Add(new AuthorizeAttribute 
         { 
          ActiveAuthenticationSchemes = "BasicAuth" 
         }); 
    
        }); 
    
        //snip 
    } 
    

    そして、それをオーバーライド:

    [AllowAnonymous] 
    public string UnsecureAction() 
    { 
        //snip 
    } 
    
3

を私が唯一の認証として私が欲しいのスキームを設定することにより、デフォルトの認証方式を設定するには、管理しなかったあなたの ``メソッドでは、それを行うために、承認のためのDefaultPolicyのスキームあなたの設定で以下を使用してください。私はAddMvcAddAuthenticationの間でそれを使用して、それは正常に動作します。

services.AddAuthorization(config => { 
    var def = config.DefaultPolicy; 
    config.DefaultPolicy = new AuthorizationPolicy(def.Requirements, 
     new List<string>(){ "BasicAuth" }); 
}); 
0

私は同様のコードを使用しており、完全に動作します。私が見る主な違いは、AddSchemeAddAuthenticationの代わりに機能のチェーンを使用していることです。

services.AddAuthentication(options => 
{ 
    options.DefaultAuthenticateScheme = "BasicAuth"; 
    options.DefaultChallengeScheme = "BasicAuth"; 
}) 
AddScheme<AuthenticationSchemeOptions, BasicAuthenticationMiddleware> 
    ("BasicAuth", "BasicAuthenticationMiddleware", x => { }); 

その他のコードは正常です。

関連する問題