Я пытаюсь создать свой собственный 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());
}
}
- Если есть действительный файл cookie авторизации, используйте его для аутентификации
- Если нет действительного cookie-файла аутентификации, вызовите его, используя мой auth, и в случае успеха создайте cookie-файл auth
Это работает на практике, но я нахожу это немного странным, я делаю настоящую аутентификацию в HandleChallenge
и перенаправляю, если она не работает.
Мне также кажется странным вызывать один AuthenticationHandler (cookie) из другого (MyAuthenticationHandler).
Как я могу настроить это правильно, чтобы вместо этого я выполнял реализацию в HandleAuthenticate
?
В моей текущей реализации этот метод никогда не вызывается.
Кроме того, нормально ли вызывать один обработчик аутентификации из другого?
P.S. Я просмотрел несколько других постов и статей (включая , , , и , ), но я не смог найти ответы на свои вопросы от глядя на них. Любая помощь будет оценена.