Как настроить кодирование авторизации OpenId для решения ошибки «код уже погашен»? - PullRequest
0 голосов
/ 13 марта 2019

Насколько я знаю, 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)

...