【问题标题】:Getting access to "employeeId" or "jobTitle" Claim via Asp.Net Core 2.2 with AzureAd通过带有 AzureAd 的 Asp.Net Core 2.2 访问“employeeId”或“jobTitle”声明
【发布时间】:2019-03-13 19:58:08
【问题描述】:

我正在尝试扩展我从 AzureAd 收到的声明。我知道还有更多可用的,但我不知道从哪里开始。文档到处都是。

我基本上有一个 ASP .Net Core 2.2 Web 应用程序配置如下:

            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();   

我已经使用各种选项调整了清单文件,但似乎没有任何效果。我在 Google 上搜索了我的 *ss,但所有文档都已过期,并且不一致或已过时。

有没有人可以使用示例或教程,或者谁能告诉我如何使用我在图中找到的特定类型来丰富我的声明集?

谢谢

【问题讨论】:

    标签: asp.net-core azure-active-directory claims-based-identity claims


    【解决方案1】:

    要从 Azure AD 访问 jobTitle 到 Claims,您需要获取访问令牌才能通过 Graph API 获取 jobTitle

    详细步骤。

    1. 获取accesstoken需要在Azure中提供ClientSecretApp registrations
    2. App Registrations->Your application->Settings->Keys->ClientSecret or any string for Key Description->Expires for your own scenario->复制生成的ClientSecret
    3. 启动.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);
      }
      

    【讨论】:

    • 谢谢,必须导入Microsoft.IdentityModel.Clients.ActiveDirectory 包才能使其正常工作,但现在它工作正常,我终于明白了为什么。感谢您抽出宝贵时间。
    猜你喜欢
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多