Я установил свое веб-приложение с помощью 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 Адал. Я не уверен, что это относится к моей проблеме.
Я использую 'Microsoft.IdentityModel.Clients.ActiveDirectory' для обмена кодом auth (см. Обновленный вопрос). Я не уверен, что можно изменить его, чтобы политика была отправлена в теле запроса. Я попробовал с альтернативным URL, который вы предоставили, но это тоже не сработало. Я явно делаю что-то резко ошибочно. – Mardoxx
Эта библиотека (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). –
@Mardoxx вы можете подтвердить, что это была проблема? –