'AADSTS70000: Ошибка синтаксического анализатора данных передачи: код авторизации искажен или недействителен

У меня возникают проблемы при аутентификации пользователя с его учетной записью Microsoft. Я использую аутентификацию OpenId Connect, но когда я вызываю метод AcquireTokenByAuthorizationCodeAsync, я получаю следующее сообщение.

Возникло исключение: «Microsoft.IdentityModel.Clients.ActiveDirectory.AdalServiceException» в System.Private.CoreLib.dll: «AADSTS70000: сбой синтаксического анализатора данных передачи: код авторизации искажен или недействителен.

Варианты авторизации следующие:

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;

        }).AddOpenIdConnect(openIdOptions => 
        {
            openIdOptions.ResponseType = OpenIdConnectResponseType.CodeIdToken;
            openIdOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            openIdOptions.Authority = String.Format(CultureInfo.InvariantCulture, "https://login.microsoftonline.com/{0}{1}", "common", "/v2.0");
            openIdOptions.ClientId = Configuration["MicrosoftAuth:ClientId"];
            openIdOptions.ClientSecret = Configuration["MicrosoftAuth:ClientSecret"];
            openIdOptions.SaveTokens = true;
            openIdOptions.TokenValidationParameters = new TokenValidationParameters{
                ValidateIssuer = false
            };
            var scopes = Configuration["MicrosoftAuth:Scopes"].Split(' ');
                foreach (string scope in scopes){
                    openIdOptions.Scope.Add(scope);
            }
            openIdOptions.Events = new OpenIdConnectEvents{
                OnAuthorizationCodeReceived = async (context) =>
                {   
                    var code = context.ProtocolMessage.Code;
                    var identifier = context.Principal.Claims.First(item => item.Type == ObjectIdentifierType).Value;
                    IMemoryCache memoryCache = context.HttpContext.RequestServices.GetRequiredService<IMemoryCache>();
                    var result = await GetTokenByAuthorizationCodeAsync(identifier, code, memoryCache);
                    context.HandleCodeRedemption(result.AccessToken, result.IdToken);
                },
            };
        });

И вот как выглядит мой GetTokenByAuthorizationCodeAsync (я знаю, что это некрасиво, просто пытаюсь заставить его работать):

public async Task<AuthenticationResult> GetTokenByAuthorizationCodeAsync(string userId, string code, IMemoryCache memoryCache)
    {
        TokenCache userTokenCache = new SessionTokenCache(userId, memoryCache).GetCacheInstance();
        try
        {
            AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/common/oauth2/v2.0/token/", userTokenCache);
            ClientCredential credential = new ClientCredential(Configuration["MicrosoftAuth:ClientId"], Configuration["MicrosoftAuth:ClientSecret"]);
            string[] scope = new List<String>().Append("https://graph.windows.net").ToArray();
            AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code,new Uri(Configuration["MicrosoftAuth:RedirectUri"]), credential, Configuration["MicrosoftAuth:ResourceId"]);
            return result;
        }
        catch (Exception)
        {
            return null;
        }
    }

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

Я зарегистрировал приложение на портале регистрации приложений Microsoft (https://apps.dev.microsoft.com/< /а>).


person Marcos Trucco    schedule 27.09.2017    source источник


Ответы (1)


Вы использовали библиотеку Microsoft.IdentityModel.Clients.ActiveDirectory для получения токена доступа. Эта библиотека используется для приложения Azure AD, которое регистрируется на портале Azure вместо конечной точки Azure AD версии 2.0.

Чтобы получить токен для приложений Azure AD версии 2.0, мы можем использовать MSAL. И вот пример кода для справки:

OnAuthorizationCodeReceived = async (context) =>
{
    var code = context.ProtocolMessage.Code;
    ConfidentialClientApplication cca =
        new ConfidentialClientApplication(Configuration["AzureAD:ClientId"], Configuration["AzureAd:PostLogoutRedirectUri"]+ "signin-oidc", new ClientCredential(Configuration["AzureAD:Secret"]), null, null);
    var result =await cca.AcquireTokenByAuthorizationCodeAsync(code,new string[]{"user.read"});
    context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
person Fei Xue - MSFT    schedule 28.09.2017
comment
Привет! Большое спасибо за вашу помощь. Мне удалось установить пакет MSAL, купите сейчас, у меня проблемы с областями. Я получаю следующее сообщение: AADSTS70000: запрос был отклонен, потому что одна или несколько запрошенных областей неавторизованы или срок их действия истек. Пользователь должен сначала войти в систему и предоставить клиентскому приложению доступ к запрошенной области. Я думал, что это может быть связано с областями, определенными в CCA, но когда я добавляю их в строку результата var, я получаю ту же проблему. Однако области определяются на портале регистрации приложений, поэтому я действительно не знаю, в чем проблема. - person Marcos Trucco; 28.09.2017
comment
Неважно. Мне удалось заставить его работать. Теперь я могу аутентифицировать своего пользователя с помощью OpenId Connect, с этим проблем нет. Пришлось добавить области openid, profile и offline_access на портале приложений. Теперь у меня проблемы с работой с пакетом Graph. Должен ли я задать другой вопрос или дать более подробную информацию здесь? - person Marcos Trucco; 28.09.2017
comment
Для другого вопроса я предлагаю вам повторно открыть новую ветку, чтобы сообщество могло легче распознать проблему. И если этот пост полезен для исходной проблемы, вы можете принять это как ответ. И другое сообщество, у которого есть такая же проблема, может легко найти проблему и получить помощь в этой теме :) - person Fei Xue - MSFT; 29.09.2017