Правильно настроить конфигурацию двойной (смешанной) авторизации на ядре .net - PullRequest
1 голос
/ 13 мая 2019

У меня есть сайт, который включает в себя методы API внутри.Некоторые действия работают как для браузера, так и для мобильного телефона.Обычно, когда пользователи открывают веб-страницу, они перенаправляются на страницу входа.Но если пользователи приходят с мобильного телефона, их нельзя перенаправлять на страницу входа в систему, и они будут вынуждены проходить аутентификацию через токен jwt (носитель)

Я просто прочитал документацию .net и обнаружил (смешанно-двойную) аутентификацию,

Вот как я использовал эту функцию и ждал вашего совета

services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,options =>
{
    options.ExpireTimeSpan = defaultSetup.CookieExpireTimeSpan;
    options.Cookie.Name = defaultSetup.CookieName;
    options.AccessDeniedPath = identitySettings.ThisProjectAccessDeniedPath;
    options.LoginPath = identitySettings.ThisProjectLoginPath;
    options.LogoutPath = identitySettings.ThisProjectLogoutPath;
})
.AddJwtBearer();

В моем контроллере

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class OrderController : BaseController
{
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

Если я использую только [Authorize] с CookieAuthenticationDefaults.AuthenticationScheme перенаправление страницы входа в систему и вход в систему работает отлично, но он всегда перенаправляет на страницу входа.

Если я использую [Authorize] с JwtBearerDefaults.AuthenticationScheme, он работает только с токеном Bearer.

1 Ответ

0 голосов
/ 15 мая 2019

Я бы предложил вам иметь отдельные области для API и веб-страниц.У вас могут быть контроллеры с одинаковыми именами в разных областях.Без сомнения, это повторение логики, но вы можете спроектировать так, чтобы фактическая реализация была в общих методах, вызываемых из двух действий.

            services.AddAuthentication(options => {
                options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            }).AddCookie(options =>
            {
                options.AccessDeniedPath = new PathString("/Console/Account/Index/");
                options.LoginPath = new PathString("/Console/Account/Index/");
            })
            .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwtBearerOptions => {
                jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters {
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = JWT_Sec_Key,  
                    ValidateLifetime = true, //validate the expiration and not before values in the token
                    ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
                };
            });

Здесь по умолчанию auth - Cookie, поэтому включите только [Authorize]Контроллеры веб-страниц.

Используйте [Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] для контроллеров API.

EDIT:

Я где-то читалчто вы даже можете предоставить обе схемы, например

[Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme + "," + CookieAuthenticationDefaults.AuthenticationScheme)]

Пожалуйста, попробуйте и дайте мне знать ...

EDIT2: Возможно использование нескольких аннотаций.Ссылка: https://github.com/auth0-samples/aspnet-core-mvc-plus-webapi

[Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] [Authorize (AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]

...