ASP.NET Core, использующий пользовательский обработчик аутентификации с помощью cookieauthentication - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать свой собственный 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-файла аутентификации, вызовите его, используя мой auth, и в случае успеха создайте cookie-файл auth

Это работает на практике, но я нахожу это немного странным, я делаю настоящую аутентификацию в HandleChallenge и перенаправляю, если она не работает. Мне также кажется странным вызывать один AuthenticationHandler (cookie) из другого (MyAuthenticationHandler).

Как я могу настроить это правильно, чтобы вместо этого я выполнял реализацию в HandleAuthenticate? В моей текущей реализации этот метод никогда не вызывается.

Кроме того, нормально ли вызывать один обработчик аутентификации из другого?

P.S. Я просмотрел несколько других постов и статей (включая , , , и , ), но я не смог найти ответы на свои вопросы от глядя на них. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 16 мая 2018

Я думаю, что то, что вам нужно, может быть решено с помощью некоторых новых частей в ASP.NET Core 2.1

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

Вот пример того, как "выбирать" схемы аутентификации на основена httpcontext data:

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...