Получить имя пользователя в токене B2C - PullRequest
0 голосов
/ 08 октября 2018

Мне нужно добавить в претензии имя пользователя пользователя.Я нашел эту ссылку, где описано, как это сделать: 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());
        }
    }

Подскажите, пожалуйста, как добиться получения имени пользователя в токене?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...