独自の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());
}
}
これは実際には機能しますが、HandleChallenge
で実際の認証を行い、失敗した場合はリダイレクトするのは少し奇妙だと思います。また、あるAuthenticationHandler(cookie)を別のAuthenticationHandler(MyAuthenticationHandler)から呼び出すのも奇妙に思えます。
代わりにHandleAuthenticate
で実装を行うように、これを正しく設定するにはどうすればよいですか?現在の実装では、そのメソッドは決してありません実際に呼ばれます。
また、ある認証ハンドラーを別の認証ハンドラーから呼び出しても大丈夫ですか?
P.S.他のいくつかの投稿や記事( this 、 this 、 this を含む)を見ましたが、答えを見つけることができませんでしたそれらを見ることからの私の質問。どんな助けでもいただければ幸いです。
あなたが求めているものは、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スレッド をご覧ください。