-1

Я установил свое веб-приложение с помощью OpenIDConnectAuthentication следующим образом. В уведомлении OnAuthorizationCodeReceived используется Microsoft.IdentityModel.Clients.ActiveDirectory 3.13.8.Azure B2C Active Directory Коды OpenIDConnect и авторизации

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions 
    { 
     MetadataAddress = Settings.AADB2CAuth.SignInPolicyMetaAddress, // https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration?p={policy} policy = B2C_1_SignIn 
     AuthenticationType = Settings.AADB2CAuth.SignInPolicyId, // B2C_1_SignIn 

     ClientId = Settings.AADB2CAuth.ClientId, // {guid} 

     Notifications = new OpenIdConnectAuthenticationNotifications 
     { 
      AuthenticationFailed = OnAuthenticationFailed, 
      AuthorizationCodeReceived = OnAuthorizationCodeReceived 
     }, 

     RedirectUri = Settings.AADB2CAuth.RedirectUri, 

     Scope = "openid", 
     ResponseType = "id_token", 
    }); 

private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification context) 
{ 
    var code = context.Code; 
    ClientCredential clientCredential = new ClientCredential(Settings.AADB2CAuth.ClientId, Settings.AADB2CAuth.ClientSecret); 
    string userObjectID = context.AuthenticationTicket.Identity.FindFirst(Settings.ClaimTypes.ObjectIdentifier).Value; 

    string authority = Settings.AADB2CAuth.Authority; // https://login.microsoftonline.com/{tenant} 

    AuthenticationContext authContext = new AuthenticationContext(authority, new ADAL.ADALTokenCache(userObjectID)); 

    Uri redirectUri = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)); 

    AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, redirectUri, clientCredential, Settings.AADGraphApi.GraphResourceId); 
} 

Это прекрасно работает. Однако код авторизации не возвращается с id_token. Если изменить это code id_token или просто code, в AuthorizationCodeReceived уведомления пожаров, но потом я встретил с ошибкой

AADSTS70000: Authentication failed: Authorization Code is malformed or invalid

В основном то, что я пытаюсь сделать, это получить доступ к B2C AD как текущего авторизованного пользователя. Это вообще возможно?


Я обновил свои параметры аутентификации для

new OpenIdConnectAuthenticationOptions 
{ 
    AuthenticationType = Settings.AADB2CAuth.SignInPolicyId, 
    Authority = string.Format("https://login.microsoftonline.com/tfp/{0}/{1}", Settings.AADB2CAuth.Tenant, Settings.AADB2CAuth.SignInPolicyId), 
    ClientId = Settings.AADB2CAuth.ClientId, 

    Notifications = new OpenIdConnectAuthenticationNotifications 
    { 
     AuthenticationFailed = OnAuthenticationFailed, 
     AuthorizationCodeReceived = OnAuthorizationCodeReceived 
    }, 

    RedirectUri = Settings.AADB2CAuth.RedirectUri, 

    Scope = "openid", 
    ResponseType = "code id_token", 
}); 

private async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedNotification context) 
{ 
    var code = context.Code; 
    ClientCredential clientCredential = new ClientCredential(Settings.AADB2CAuth.ClientId, Settings.AADB2CAuth.ClientSecret); 
    string userObjectID = context.AuthenticationTicket.Identity.FindFirst(Settings.ClaimTypes.ObjectIdentifier).Value; 
    string authority = string.Format("https://login.microsoftonline.com/tfp/{0}/{1}", Settings.AADB2CAuth.Tenant, Settings.AADB2CAuth.SignInPolicyId); 
    AuthenticationContext authContext = new AuthenticationContext(authority, new ADAL.ADALTokenCache(userObjectID)); 

    Uri redirectUri = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)); 

    AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, redirectUri, clientCredential, Settings.AADGraphApi.GraphResourceId); 
} 

теперь я встретился с исключением, сведения о котором содержание HTML из 404 страницы. Глядя на запросы, я считаю, что это потому, что AcquireTokenByAuthorizationCodeAsync смотрит на https://login.microsoftonline.com/tfp/oauth2/token, чтобы отправить код авторизации, который я не думаю, что он должен?


Может быть, стоит отметить, что заголовок кода авторизации я получаю обратно следующее:

{ 
    "kid": "cpimcore_09252015", 
    "ver": "1.0" 
} 

Быстрый поиск Google для этого дает one result и это ссылается на following issue на Android Адал. Я не уверен, что это относится к моей проблеме.

ответ

3

Если вы посмотрите на начале этой ошибки:

AADSTSXXXXX

означает, что, когда вы пытались обменять свой код аутентификации, вы пошли на AAD петли, а не ожидаемые B2C петли:

AADB2CXXXXX

Это означает, что ваш запрос на отправку кода аутентификации был неверно интерпретирован нашей конечной точкой. Это обычно, вызванное тем, что политика (p = B2C_1_xxxx) Параметр для B2C добавляется к URL-адресу сообщения, а не внутри запроса.

Вариант 1: рефакторинг кода и библиотеки использования приклеить параметры политики внутри после запроса аутентификации коды, а не конец маркеров конечной точки URL.

Вариант 2: Используйте конечную точку альтернативного маркера и не используйте ни один политический параметр. Ваша новая конечная точка будет выглядеть так:

https://login.microsoftonline.com/tfp/{tenant}/B2C_1_myB2CPolicy/oauth2/v2.0/token 
+0

Я использую 'Microsoft.IdentityModel.Clients.ActiveDirectory' для обмена кодом auth (см. Обновленный вопрос). Я не уверен, что можно изменить его, чтобы политика была отправлена ​​в теле запроса. Я попробовал с альтернативным URL, который вы предоставили, но это тоже не сработало. Я явно делаю что-то резко ошибочно. – Mardoxx

+1

Эта библиотека (ADAL) предназначена для того, что Azure AD вызывает «v1 apps».Технически приложения B2C считаются «приложениями v2» или «конвергентными приложениями» (уведомление внутри URL-адреса есть '/ v2.0'). Существует новая библиотека для приложений v2 под названием [MSAL] (https://github.com/AzureAD/microsoft-authentication-library-for-dotnet). Вот [образец с использованием MSAL] (https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-v2). –

+0

@Mardoxx вы можете подтвердить, что это была проблема? –