Другой тип аутентификации для одного контроллера - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть фоновое приложение WEB API CORE 3.0. Его контроллеры защищены с Azure AD. Для этого я использую веб-библиотеку microsoft identity.

В исходном коде я настраиваю ее так:

        public void ConfigureServices(IServiceCollection services)
        {
            Trace.TraceInformation("Configuring services");
        services.AddProtectedWebApi(Configuration, subscribeToJwtBearerMiddlewareDiagnosticsEvents: true)
            .AddProtectedApiCallsWebApis(Configuration)
            .AddInMemoryTokenCaches();
...

И для защиты контроллера я использую [Authorize].

Все работает отлично.

Теперь я хочу добавить второй способ авторизации пользователей (наряду с Azure AD). Я хочу, чтобы пользователи могли входить либо с Azure AD, либо, скажем, JWT.

Возможно ли реализовать его для того же контроллера?

1 Ответ

2 голосов
/ 21 февраля 2020

Можно ли изменить существующий механизм авторизации, чтобы позволить пользователям, не являющимся пользователями AzureAD, использовать контроллер.

Похоже, вы пытаетесь настроить [Authorize] для разрешения нескольких Схема аутентификации одновременно. Если это так, вы должны сначала зарегистрировать эту схему аутентификации с помощью AddAuthentication().AddMyScheme1().AddMyScheme2()...:

services.AddAuthentication()
    .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    .AddJwtBearer(otps=>{
        otps.TokenValidationParameters = new TokenValidationParameters{ ...};
    });

, а затем изменить политику авторизации по умолчанию, чтобы аутентифицировать эти схемы аутентификации одновременно. Например, если вы хотите разрешить Identity / JwtBearer / AzureAd в то же время, вы можете сделать это следующим образом

services.AddAuthorization(opts =>{
    opts.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes(
            IdentityConstants.ApplicationScheme     // ASP.NET Core Identity Authentication
            ,JwtBearerDefaults.AuthenticationScheme // JwtBearer Authentication
            // ,"AzureAD"                           // AzureAd Authentication
        )
        .RequireAuthenticatedUser()
        .Build();
});

или если вы хотите разрешить только указывать c пользователя / роль далее, не стесняйтесь настроить его по:

opts.DefaultPolicy = new AuthorizationPolicyBuilder()
    .AddAuthenticationSchemes(
        IdentityConstants.ApplicationScheme     // ASP.NET Core Identity Authentication
        ,JwtBearerDefaults.AuthenticationScheme // JwtBearer Authentication
        // ,"AzureAD"                           // AzureAd Authentication
    )
    .RequireAuthenticatedUser()
    .RequireRole(...)
    .RequireAssertion(ctx =>{
        ...
        return true_or_false;
    })
    .Build();
...