ASP.NET Core使用Azure Active Directory进行身份验证,并跨请求保留自定义声明

Fan*_*tic 4 c# asp.net authentication claims-based-identity azure-active-directory

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

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

User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
Run Code Online (Sandbox Code Playgroud)

我想为登录用户添加自定义声明 - CompanyId = 123456.我可以添加自定义声明,但只能在设置声明的页面上提供.

Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
((ClaimsIdentity)User.Identity).AddClaim(claim);
Run Code Online (Sandbox Code Playgroud)

我的理解是,我需要更新Active Directory发布的令牌或在发出令牌之前设置声明.我不确定该怎么做.

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

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

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

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

Nan*_* Yu 5

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);
}
Run Code Online (Sandbox Code Playgroud)

设置OpenIdConnectEvents:

Events = new OpenIdConnectEvents
{
    OnRemoteFailure = OnAuthenticationFailed,
    OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,

    OnTokenValidated = TokenValidated
}
Run Code Online (Sandbox Code Playgroud)

然后在控制器中使用:

var companyId=  User.Claims.FirstOrDefault(c => c.Type == "CompanyId")?.Value;
Run Code Online (Sandbox Code Playgroud)