У меня возникают проблемы при аутентификации пользователя с его учетной записью 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/< /а>).