AddJwtBearer + AddAzureADBearer Не работают вместе - PullRequest
0 голосов
/ 26 марта 2020

Я пишу часть аутентификации (. Net Core 2.1), где он может использовать JWT от поставщика услуг или токен от AzureAD. Я написал следующий тест, чтобы понять, что требуется, но кажется, что первый провайдер аутентификации всегда срабатывает при тестировании с почтальоном и отправке через токен на предъявителя.

Я поставил точку останова на обоих События поставщиков носителей, если я вызываю контроллер значений с токеном носителя, он попадает в «первый», хотя я указал использование AuthenticationScheme «second»

Startup.cs

services.AddAuthentication("first")
    .AddJwtBearer("first", options =>
    {
        options.Authority = "https://123";
        options.TokenValidationParameters =
        new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidAudiences = new[] { "123" }
        };
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                var accesToken = context.SecurityToken;
                return Task.CompletedTask;
            },
            OnAuthenticationFailed = context =>
            {
                var accessToken = context.Principal;
                return Task.CompletedTask;
            },
        };
        })
    .AddAzureADBearer("second", 
        AzureADDefaults.JwtBearerAuthenticationScheme, 
        options => Configuration.Bind("AzureAd", options));

    // Added
    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, 
        options =>
        {
        //Configuration.Bind("AzureAd", options);
        //options.Authority += "/v2.0";
            options.TokenValidationParameters.ValidAudiences = new[] { options.Audience, $"api://{options.Audience}" };

            options.TokenValidationParameters.ValidateIssuer = true;
            options.IncludeErrorDetails = true;
            options.TokenValidationParameters.ValidateLifetime = false;

            options.Events = new JwtBearerEvents
            {
                OnTokenValidated = context =>
                {
                    var accesToken = context.SecurityToken;
                    return Task.CompletedTask;
                },
                OnAuthenticationFailed = context =>
                {
                    var accessToken = context.Principal;
                    return Task.CompletedTask;
                }
            };
        });

ValuesController.cs

[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = "second")]
public class ValuesController : ControllerBase
{
    // GET api/values
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

любая помощь будет оценена.

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте использовать политики для включения AuthenticationSchemes

Мы используем что-то вроде этого (не пробовал запускать код)

services
.AddPolicyScheme("first", "First policy selector", options =>
{
    options.ForwardDefaultSelector = context =>
    {
        return "first"
    };
})
.AddPolicyScheme("second", "Second policy selector", options =>
{
    options.ForwardDefaultSelector = context =>
    {
        return "second"
    };
})
.AddAuthentication("first")
    .AddJwtBearer("first", options =>
    {
        options.Authority = "https://123";
        options.TokenValidationParameters =
        new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidAudiences = new[] { "123" }
        };
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                var accesToken = context.SecurityToken;
                return Task.CompletedTask;
            },
            OnAuthenticationFailed = context =>
            {
                var accessToken = context.Principal;
                return Task.CompletedTask;
            },
        };
        })
    .AddAzureADBearer("second", 
        AzureADDefaults.JwtBearerAuthenticationScheme, 
        options => Configuration.Bind("AzureAd", options));

    // Added
    services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, 
        options =>
        {
        //Configuration.Bind("AzureAd", options);
        //options.Authority += "/v2.0";
            options.TokenValidationParameters.ValidAudiences = new[] { options.Audience, $"api://{options.Audience}" };

            options.TokenValidationParameters.ValidateIssuer = true;
            options.IncludeErrorDetails = true;
            options.TokenValidationParameters.ValidateLifetime = false;

            options.Events = new JwtBearerEvents
            {
                OnTokenValidated = context =>
                {
                    var accesToken = context.SecurityToken;
                    return Task.CompletedTask;
                },
                OnAuthenticationFailed = context =>
                {
                    var accessToken = context.Principal;
                    return Task.CompletedTask;
                }
            };
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...