我是Azure AD B2C的新手,并且已经设置了一个使用本地帐户正确验证的网站(仅限电子邮件)。当验证请求返回时,我会在“电子邮件”声明下看到电子邮件地址,但“名称”声明会以“未知”的形式返回。
在Azure门户中查看,该帐户已创建,但该名称未设置,并且对于注册的所有用户而言都是“未知”。这不是我所期待的。我希望默认情况下将“名称”设置为电子邮件地址,以便在门户网站中更容易找到帐户,因为我们根本没有为此帐户类型收集“显示名称”(用户已进入)给予和姓氏)。
我是否配置错误,是否有办法将用户名默认为本地电子邮件帐户的电子邮件地址?
答案 0 :(得分:3)
Azure AD B2C不会自动填充"任何领域。
当您设置注册政策或统一注册/登录策略时,您可以选择注册属性。这些是向用户显示的属性,供他/她提供,然后存储在Azure AD B2C中。
任何未提示用户的内容都是空的,或者在一些特定情况下(如您所观察到的名称)设置为“未知”。
Azure AD B2C无法假设使用预先填充给定属性的内容。虽然您可能会发现将电子邮件用作名称的默认值是可以接受的,但其他人可能不会。另一个例子,对于某些人来说,显示名称可以预先填充" {名字} {姓氏}",但对于其他人,它反过来" {Surname,给定名称}"
您实际需要的是一种简单的方法来配置某些属性的默认值,而这些属性并非今天可用。您可以在Azure AD B2C UserVoice forum。
中申请此功能目前,您有两种选择:
这是一个快速的&您可以使用的.Net代码的脏代码段(假设您想在auth管道中执行此操作(Startup.Auth.cs):
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));
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + t.AccessToken);
var url = graphResource + tenant + "/users/" + userObjectId + "/?api-version=1.6";
var name = "myDisplayName";
var content = new StringContent("{ \"displayName\":\"" + name + "\" }", Encoding.UTF8, "application/json");
var result = await client.PostAsync(url, content);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
在设置OpenIdConnectAuthenticationOptions时,您将引用此方法,如下所示:
new OpenIdConnectAuthenticationOptions
{
// (...)
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
SecurityTokenValidated = OnSecurityTokenValidated,
},
// (...)
};
答案 1 :(得分:0)
我写了这个扩展名:
public static class ClaimsPrincipal
{
public static string Username(this System.Security.Claims.ClaimsPrincipal user)=> user.Claims.FirstOrDefault(c => c.Type == "preferred_username").Value;
}
现在您可以使用 User.Identity.Name作为名称(如果您在Startup.cs
的OpenId配置中具有此名称)options.TokenValidationParameters = new TokenValidationParameters() { NameClaimType = "name" };
和User.Username(如果包含扩展名)