2017-02-12 2 views
3

Я настроил поставщик удостоверений, чтобы использовать локальные учетные записи с именами пользователей, а не паролями.Azure AD B2C - местный IDP с «именем пользователя», не предоставляющим заявку на имя пользователя

Я создал пользователя с отображаемым именем, именем пользователя и электронной почтой.

Я могу выбрать заявки «Показать имя» и «Адрес электронной почты» для всех политик, но «Имя пользователя» не является вариантом. Я также подтвердил, что заявка на имя пользователя не предоставляется моему приложению.

Как настроить Azure AD B2C таким образом, чтобы он запрашивал имя пользователя?

IDP Config

enter image description here

enter image description here

ответ

2

К сожалению, имя пользователя, пока не доступен для выбора в качестве требования, чтобы передать в маркере. Вы должны голосовать за это спросить на форуме 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, 
      }, 
      // (...) 
     }; 
+0

Выше выглядит хорошее предложение. Это может показаться очевидным, но для тех, кто новичок в Azure B2C, не забывайте, что для того, чтобы Azure B2C возвратил objectId в качестве претензии в токен (http://schemas.microsoft.com/identity/claims/objectidentifier) , вам необходимо убедиться, что вы проверили идентификатор объекта Users в показанном выше окне, который позволяет вам выбрать, какие атрибуты включать в качестве претензий. –

+0

Я подписал запрос, поскольку мне очень странно, что B2C существует для аутентификации пользователя, но затем не сообщает нам, какой пользователь ... – radders

Смежные вопросы