在Azure AD B2C中设置电子邮件本地帐户的显示名称/用户名?

时间:2017-02-13 15:26:19

标签: azure-ad-b2c

我是Azure AD B2C的新手,并且已经设置了一个使用本地帐户正确验证的网站(仅限电子邮件)。当验证请求返回时,我会在“电子邮件”声明下看到电子邮件地址,但“名称”声明会以“未知”的形式返回。

在Azure门户中查看,该帐户已创建,但该名称未设置,并且对于注册的所有用户而言都是“未知”。这不是我所期待的。我希望默认情况下将“名称”设置为电子邮件地址,以便在门户网站中更容易找到帐户,因为我们根本没有为此帐户类型收集“显示名称”(用户已进入)给予和姓氏)。

我是否配置错误,是否有办法将用户名默认为本地电子邮件帐户的电子邮件地址?

2 个答案:

答案 0 :(得分:3)

Azure AD B2C不会自动填充"任何领域

当您设置注册政策或统一注册/登录策略时,您可以选择注册属性。这些是向用户显示的属性,供他/她提供,然后存储在Azure AD B2C中。

任何未提示用户的内容都是空的,或者在一些特定情况下(如您所观察到的名称)设置为“未知”。

Azure AD B2C无法假设使用预先填充给定属性的内容。虽然您可能会发现将电子邮件用作名称的默认值是可以接受的,但其他人可能不会。另一个例子,对于某些人来说,显示名称可以预先填充" {名字} {姓氏}",但对于其他人,它反过来" {Surname,给定名称}"

您实际需要的是一种简单的方法来配置某些属性的默认值,而这些属性并非今天可用。您可以在Azure AD B2C UserVoice forum

中申请此功能

目前,您有两种选择:

  1. 强制用户明确提供此值,方法是将其选为政策中的注册属性。
  2. 添加一些代码,用您想要的任何逻辑更新这些属性(例如,在处理新注册的控制器中或通过定期运行的无头客户端)。
  3. 这是一个快速的&您可以使用的.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(如果包含扩展名)