【问题标题】:ASP.NET Core authenticating with Azure Active Directory and persisting custom Claims across requestsASP.NET Core 使用 Azure Active Directory 进行身份验证并跨请求保留自定义声明
【发布时间】:2017-07-04 00:25:45
【问题描述】:

我在 Visual Studio 2017 中创建了一个默认的 ASP.NET Core 网站。我选择使用 Azure Active Directory 进行身份验证。 我运行该站点,并且可以使用 Active Directory 中的帐户成功登录。

我可以检索 Active Directory 提供的声明信息,例如通过调用以下行,我得到了“名称”。

User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;

我想为登录的用户添加自定义声明 - CompanyId = 123456。 我可以添加自定义声明,但它仅在设置声明的页面上可用。

Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
((ClaimsIdentity)User.Identity).AddClaim(claim);

我的理解是,我需要以某种方式更新由 Active Directory 颁发的令牌或在颁发令牌之前设置声明。我不确定该怎么做。

我怀疑这需要在 SignIn() 的 AccountController 中完成

// GET: /Account/SignIn
[HttpGet]
public IActionResult SignIn()
{
    return Challenge(
            new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectDefaults.AuthenticationScheme);
}

我已经阅读了很多关于这种情况的文章和示例(包括https://github.com/ahelland/AADGuide-CodeSamples/tree/master/ClaimsWebApp),但是还没有设法解决如何跨请求持久化声明。

我已成功设法使用 ASP.NET 身份作为身份验证提供程序来持久化自定义声明,但这似乎是因为自定义声明已保存到数据库中。..

【问题讨论】:

    标签: c# asp.net authentication azure-active-directory claims-based-identity


    【解决方案1】:

    OnTokenValidated 为您提供了修改从传入令牌获得的ClaimsIdentity 的机会,以下代码供您参考:

    private Task TokenValidated(TokenValidatedContext context)
    {
        Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
        (context.Ticket.Principal.Identity as ClaimsIdentity).AddClaim(claim);
    
        return Task.FromResult(0);
    }
    

    设置OpenIdConnectEvents:

    Events = new OpenIdConnectEvents
    {
        OnRemoteFailure = OnAuthenticationFailed,
        OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
    
        OnTokenValidated = TokenValidated
    }
    

    然后在控制器中使用:

    var companyId=  User.Claims.FirstOrDefault(c => c.Type == "CompanyId")?.Value;
    

    【讨论】:

      【解决方案2】:

      对于那些想要了解更多细节的人,提供的代码放在 Startup.cs 中

      在配置方法中添加/编辑:

      app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
      {
          ClientId = Configuration["Authentication:AzureAd:ClientId"],
          Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
          CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"],
          Events = new OpenIdConnectEvents
          {
              OnTokenValidated = TokenValidated
          }
      });
      

      私有 Task TokenValidated 方法在 Startup.cs 的主体中

      以下示例是一个很好的参考。 https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-aspnetcore-v2/blob/master/WebApp-OpenIDConnect-DotNet/Startup.cs

      【讨论】:

        猜你喜欢
        • 2017-02-25
        • 2017-12-09
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        相关资源
        最近更新 更多