К сожалению, имя пользователя, пока не доступен для выбора в качестве требования, чтобы передать в маркере. Вы должны голосовать за это спросить на форуме Azure AD B2C UserVoice помочь приоритеты это: Include username in JWT claims
Ваш единственный вариант, как на этот раз, чтобы получить его самостоятельно через Graph.
Вот быстрого & грязного фрагмента кода .NET, который вы можете использовать для этого:
private async Task OnSecurityTokenValidated(SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
{
try
{
var userObjectId = notification.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier")?.Value;
// You'll need to register a separate app for this.
// This app will need APPLICATION (not Delegated) Directory.Read permissions
// Check out this link for more info:
// https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet
var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(string.Format(graphAuthority, tenant));
var t = await authContext.AcquireTokenAsync(graphResource, new ClientCredential(graphClientId, graphClientSecret));
string result;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.AccessToken);
var url = graphResource + tenant + "https://stackoverflow.com/users/" + userObjectId + "/?api-version=1.6";
result = await client.GetStringAsync(url);
}
var jsonResult = JObject.Parse(result);
var username = jsonResult["signInNames"].FirstOrDefault(j => j["type"].ToString() == "userName")?["value"]?.ToString();
notification.AuthenticationTicket.Identity.AddClaim(new Claim("username", username));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Вы ссылаться на этот метод, когда вы настроить ваш OpenIdConnectAuthenticationOptions как так:
new OpenIdConnectAuthenticationOptions
{
// (...)
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
SecurityTokenValidated = OnSecurityTokenValidated,
},
// (...)
};
Выше выглядит хорошее предложение. Это может показаться очевидным, но для тех, кто новичок в Azure B2C, не забывайте, что для того, чтобы Azure B2C возвратил objectId в качестве претензии в токен (http://schemas.microsoft.com/identity/claims/objectidentifier) , вам необходимо убедиться, что вы проверили идентификатор объекта Users в показанном выше окне, который позволяет вам выбрать, какие атрибуты включать в качестве претензий. –
Я подписал запрос, поскольку мне очень странно, что B2C существует для аутентификации пользователя, но затем не сообщает нам, какой пользователь ... – radders