Насколько я знаю, Microsoft внесла некоторые изменения в их логику аутентификации в октябре 2018 года. После этого я получаю " Код авторизации OAuth2 уже был погашен . .. "- ошибка при попытке войти в мое веб-приложение.
Используется OpenIdConnect, и мне нужно настроить код, чтобы обновить токен, чтобы иметь возможность вызывать два рессоруса (Azure + Graph). Я много гуглил и нашел несколько решений, где использовался метод context.HandleCodeRedemption
, но если я попытаюсь вызвать этот метод в моем контексте, он не существует. Вот мой код от Startup.Auth.cs
, который работал до изменения Microsoft:
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
private static string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"];
private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"];
private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"];
public static readonly string Authority = aadInstance + tenantId;
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = Authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
AuthorizationCodeReceived = (context) =>
{
var code = context.Code;
ClientCredential credential = new ClientCredential(clientId, appKey);
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID));
// get tokens for both the MS Graph API and the AAD GRaph API
AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, Globals.GraphResourceId);
AuthenticationResult result2 = authContext.AcquireTokenByAuthorizationCode(code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, Globals.AzureADResourceId);
return Task.FromResult(0);
}
}
});
app.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters()
{
ValidAudience = clientId
},
Tenant = tenantId,
AuthenticationType = "OAuth2Bearer",
});
}
Я не очень знаком с этим, потому что кодирование аутентификации происходит от внешнего программатора, который больше недоступен. У вас есть подсказка, что настраивать?
Спасибо тебе!
(базовое приложение c #; используемая версия Microsoft.Owin.Security.OpenIdConnect - 3.0.1)