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



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

我可以检索活动目录提供的索赔信息,例如,通过调用以下行,我得到"名称"。

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

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

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

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

我怀疑这需要在登录()的帐户控制器中完成

// 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 身份作为身份验证提供程序来持久化自定义声明,但这似乎是因为自定义声明已保存到数据库中。

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;

对于那些想要更多详细信息的人,提供的代码放在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
}
});

专用任务令牌验证方法位于启动的正文中.cs

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

最新更新