OpenIdConnectProtocolException: сообщение содержит ошибку: «invalid_request», описание ошибки: «AADB2C90079: - PullRequest
0 голосов
/ 16 февраля 2020

Я использую аутентификацию Azure AD B2 C в моем ASP. NET Core веб-приложении. Я также хочу получить уведомление после успешной аутентификации пользователя, чтобы я мог добавить пользовательские роли и для этого я пытаюсь зарегистрировать обратный вызов OnAuthorizationCodeReceived. Но как только я это делаю, я получаю следующее исключение ...

OpenIdConnectProtocolException: сообщение содержит ошибку: 'invalid_request', error_description: 'AADB2C90079: клиенты должны отправлять client_secret при погашении конфиденциального гранта.

Исходный код в Setup.cs, который работает, это ...

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
            .AddAzureADB2C(options => Configuration.Bind("AzureAdB2C", options));

        services.AddControllersWithViews();
        services.AddRazorPages();
    }

Но когда я добавляю следующий код в функцию ConfigureServices () ...

        services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
        {
            options.ResponseType = OpenIdConnectResponseType.Code;
            options.Events = new OpenIdConnectEvents
            {
                OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
            };
        });

public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
}

It начинает генерировать вышеупомянутое исключение, когда я нажимаю кнопку входа. Похоже, я могу аутентифицироваться и получаю обратный вызов OnAuthorizationCodeReceived. Но когда управление возвращается из OnAuthorizationCodeReceived, что исключение происходит со следующими стек ...

Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RedeemAuthorizationCodeAsyn c (OpenIdConnectMessage tokenEndpointRequest) Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsyn c ()

Пожалуйста, дайте мне знать, что здесь не так?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Спасибо Nan Yu за ваш ответ.

Наконец-то я могу это исправить, используя следующий код

services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, options =>
    {
        options.Events = new OpenIdConnectEvents
        {
            OnTokenValidated = OnTokenValidated
        };
    });

Так что инициализация options.ResponseType действительно не нужна, и OnTokenValidated работал для меня ,

0 голосов
/ 17 февраля 2020

Вы используете поток кода авторизации OAuth 2.0, поскольку вы устанавливаете code в ResponseType в OID C config:

options.ResponseType = OpenIdConnectResponseType.Code;

Пожалуйста, отметьте этот документ , поток кода должен запрашивать client_secret при запросе токена доступа, если ваше приложение является веб-приложением или веб-API.

Если вы хотите добавить пользовательские роли после входа в систему, событие OnTokenValidated дает вам возможность изменить ClaimsIdentity, полученный из входящий токен, код ниже для справки:

options.Events = new OpenIdConnectEvents
{
    OnTokenValidated = ctx =>
    {
        //query the database to get the role

        // add claims
        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Role, "Admin")
        };
        var appIdentity = new ClaimsIdentity(claims);

        ctx.Principal.AddIdentity(appIdentity);

        return Task.CompletedTask;
    },
};

Но если вы хотите запросить Microsoft Graph, используйте событие OnAuthorizationCodeReceived и MSAL для получения токена доступа для Microsoft Graph.

...