Мне нужно добавить в претензии имя пользователя пользователя.Я нашел эту ссылку, где описано, как это сделать: Azure AD B2C - локальный IDP с «Имя пользователя» не предоставляет претензию имени пользователя
В моем коде я использую OAuthBearerAuthenticationOptions
, который не содержит свойства Notification, как показано здесь:
new OpenIdConnectAuthenticationOptions
{
// (...)
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
SecurityTokenValidated = OnSecurityTokenValidated,
},
// (...)
};
My Startup.Auth
выглядит следующим образом:
public void ConfigureAuth(IAppBuilder app)
{
TokenValidationParameters tvps = new TokenValidationParameters
{
// Accept only those tokens where the audience of the token is equal to the client ID of this app
ValidAudience = ClientId,
AuthenticationType = Startup.DefaultPolicy
};
//OpenIdConnectAuthenticationNotifications notifications = new OpenIdConnectAuthenticationNotifications
//{
// SecurityTokenValidated = OnSecurityTokenValidated
//};
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
// This SecurityTokenProvider fetches the Azure AD B2C metadata & signing keys from the OpenIDConnect metadata endpoint
AccessTokenFormat = new JwtFormat(tvps, new OpenIdConnectCachingSecurityTokenProvider(String.Format(AadInstance, Tenant, DefaultPolicy))),
});
}
Также здесь я реализовал OnSecurityTokenValidated
Метод:
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:
var graphResource = "https://graph.windows.net";
var graphAuthority = "https://login.microsoftonline.com/" + "tenant";
var authContext = new Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext(string.Format(graphAuthority, tenant));
var t = await authContext.AcquireTokenAsync(graphResource, new ClientCredential("clientId", "secret"));
string result;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.AccessToken);
var url = graphResource + "tenant" + "/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(ClaimTypes.Name, username, ""));
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
Подскажите, пожалуйста, как добиться получения имени пользователя в токене?