Получение доступа к заявке «EmployeeID» или «JobTitle» через Asp.Net Ядро 2.2 с AzureAD

#asp.net-core #azure-active-directory #claims-based-identity #claims

#asp.net-core #azure-active-directory #идентификация на основе утверждений #заявки

Вопрос:

Я пытаюсь расширить утверждения, которые я получаю обратно от AzureAD. Я знаю, что доступно больше, но я понятия не имею, с чего начать. Документация находится повсюду.

В принципе, у меня есть ASP.Веб-приложение Net Core 2.2 настроено следующим образом:

             services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

            services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
                .AddAzureAD(options => Configuration.Bind("AzureAd", options));

            services.AddMvc(options =>
            {
                var policy = new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .Build();
                options.Filters.Add(new AuthorizeFilter(policy));
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  

При попытке получить доступ к заявкам с помощью приведенного ниже кода я получаю только стандартные утверждения, в то время как в AzureAD и Graph загружено больше.

             var claimsIdentity = User.Identity as ClaimsIdentity;
            ClaimsDetected = claimsIdentity?.Claims.ToList();   
  

Я уже адаптировал файл манифеста с различными параметрами, но, похоже, ничего не работает. Я погуглил свой * ss, но вся документация перегружена и не соответствует действительности или устарела.

У кого-нибудь есть рабочий пример или учебное пособие, или кто-нибудь может сказать мне, как я могу обогатить свой набор утверждений конкретными типами, которые я нашел на графике?

Спасибо

Ответ №1:

Для доступа jobTitle из Azure AD к заявкам вам потребуется получить accesstoken для получения jobTitle с помощью Graph API.

Подробные инструкции.

  1. Для получения accesstoken необходимо предоставить ClientSecret в Azure App registrations
  2. Регистрация приложений-> Ваше приложение-> Настройки-> Ключи-> clientSecret или любая строка для описания ключа-> Истекает для вашего собственного сценария-> Скопируйте созданный clientSecret
  3. Startup.cs

     public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    
        services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
            .AddAzureAD(options => Configuration.Bind("AzureAd", options));
        services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
        {
            options.ResponseType = "id_token code";
            options.ClientSecret = "ClientSecret in Azure";
            options.Events = new OpenIdConnectEvents
            {
                OnAuthorizationCodeReceived = async context => {
                    // Acquire a Token for the Graph API and cache it using ADAL. In the TodoListController, we'll use the cache to acquire a token for the Todo List API
                    string userObjectId = (context.Principal.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value;
                    var authContext = new AuthenticationContext(context.Options.Authority);
                    var credential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);
    
                    var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(context.TokenEndpointRequest.Code,
                        new Uri(context.TokenEndpointRequest.RedirectUri, UriKind.RelativeOrAbsolute), credential, "https://graph.microsoft.com");
    
                    // Notify the OIDC middleware that we already took care of code redemption.
                    context.HandleCodeRedemption(authResult.AccessToken, context.ProtocolMessage.IdToken);
                    HttpClient client = new HttpClient();
                    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me");
                    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
                    HttpResponseMessage response = await client.SendAsync(request);
                    var result = await response.Content.ReadAsStringAsync();
                    // Parse your Result to an Array
                    var jArray = JObject.Parse(result);
                    // Index the Array and select your jobTitle
                    var obj = jArray["jobTitle"].Value<string>();
                    var identity = context.Principal.Identity as ClaimsIdentity;
                    identity.AddClaim(new Claim("jobTitle", obj));
                    await Task.Yield();
                },
            };
        });
        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }
      

Комментарии:

1. Спасибо, пришлось импортировать Microsoft.IdentityModel.Clients.ActiveDirectory пакет, чтобы все заработало, но теперь это работает, и я наконец понимаю, почему. Спасибо, что нашли время.