ASP.NET 使用 Azure Active Directory 进行核心身份验证并跨请求保留自定义声明
ASP.NET Core authenticating with Azure Active Directory and persisting custom Claims across requests
我在 Visual Studio 2017 年创建了一个默认 ASP.NET 核心网站。我选择使用 Azure Active Directory 进行身份验证。
我 运行 站点并且可以使用 Active Directory 中的帐户成功登录。
我可以检索 Active Directory 提供的声明信息,例如通过调用以下行,我得到 'name'.
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 身份作为身份验证提供者来保留自定义声明,但这似乎是因为自定义声明已保存到数据库中..
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
在配置方法中add/edit:
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
}
});
私有任务 TokenValidated 方法在 Startup.cs
的正文中
我在 Visual Studio 2017 年创建了一个默认 ASP.NET 核心网站。我选择使用 Azure Active Directory 进行身份验证。 我 运行 站点并且可以使用 Active Directory 中的帐户成功登录。
我可以检索 Active Directory 提供的声明信息,例如通过调用以下行,我得到 'name'.
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 身份作为身份验证提供者来保留自定义声明,但这似乎是因为自定义声明已保存到数据库中..
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
在配置方法中add/edit:
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
}
});
私有任务 TokenValidated 方法在 Startup.cs
的正文中