web-dev-qa-db-ja.com

Cookie認証でカスタム認証ハンドラーを使用するASP.NETCore

独自のAuthenticationHandlerを作成し、Cookie認証で使用しようとしています。

services.AddAuthentication(options =>
  {
  options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  options.DefaultChallengeScheme = MyAuth.Scheme;
  })
  .AddCookie()
  .AddScheme<MyAuthenticationOptions, MyAuthenticationHandler>(MyAuth.Scheme, "My auth scheme", options => { });

public MyAuthenticationHandler(...) : base(...) {}

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        throw new NotImplementedException();  
    }    

    protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
    {                     
        var myUser = await DoAuth();

        if (!myUser.IsAuthenticated)
        {
            if (Context.Request.Query.ContainsKey("isRedirectedFromSSO"))
            {
                Context.Response.Redirect("/unauthorized");
                return;
            }
            else
            {
                Context.Response.Redirect("url to sso");
                return;
            }              
        }    

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.NameIdentifier, user.Username),            
        };

        var identity = new ClaimsIdentity(claims, MyAuth.Scheme);
        var claimsPrincipal = new ClaimsPrincipal(identity);

        var authProperties = new AuthenticationProperties {};

        await Context.SignInAsync(
            CookieAuthenticationDefaults.AuthenticationScheme,
            claimsPrincipal,
            authProperties);

        Context.Response.Redirect(Request.GetEncodedUrl());
    }
}
  1. 有効な認証Cookieがある場合は、それを使用して認証します
  2. 有効な認証Cookieがない場合は、認証を使用してチャレンジし、成功した場合は認証Cookieを作成します

これは実際には機能しますが、HandleChallengeで実際の認証を行い、失敗した場合はリダイレクトするのは少し奇妙だと思います。また、あるAuthenticationHandler(cookie)を別のAuthenticationHandler(MyAuthenticationHandler)から呼び出すのも奇妙に思えます。

代わりにHandleAuthenticateで実装を行うように、これを正しく設定するにはどうすればよいですか?現在の実装では、そのメソッドは決してありません実際に呼ばれます。

また、ある認証ハンドラーを別の認証ハンドラーから呼び出しても大丈夫ですか?

P.S.他のいくつかの投稿や記事( thisthisthis を含む)を見ましたが、答えを見つけることができませんでしたそれらを見ることからの私の質問。どんな助けでもいただければ幸いです。

5
severin

あなたが求めているものは、ASP.NET Core2.1のいくつかの新しい部分で解決されるかもしれないと思います

<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.1.0-rc1-final" />

Httpcontextデータに基づいて認証スキームを「選択」する方法のサンプルを次に示します。

builder.AddPolicyScheme("scheme", "scheme", opts =>
{
    opts.ForwardDefaultSelector = ctx =>
    {
        if (ctx.Request.Query.ContainsKey("isRedirectedFromSSO"))
        {               
            return null; // or ctx.ForbidAsync(), not sure here.
        }

        return OpenIdConnectDefaults.AuthenticationScheme; // or your own sso scheme, whatever it may be here.
    };
})
.AddCookie()
.AddOpenIdConnect();

このGitHubスレッド をご覧ください。

2
John Korsnes