我用.NET 4.5创建了一个新的ASP.NET MVC应用程序。我已成功使用STS设置身份验证。身份验证流程正常,我可以在Thread.CurrentPrincipal上获取包含所需声明的ClaimsIdentity。
现在我需要引导令牌来保护对我的服务层的调用。我在identityConfiguration元素上将saveBootstrapContext设置为true。
<system.identityModel>
<identityConfiguration saveBootstrapContext="true">
但是,ClaimsIdentity上的BootstrapContext属性始终为null。
var identity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
var context = identity.BootstrapContext; // context is always null
我在这里遗漏了什么?这被认为是直截了当的:(
-----------已解决------------
重新启动系统后,此问题已得到解决。请注意,在iisreset之后它没有解决。后来我更改了配置以使用Microsoft.IdentityModel而不是System.IdentityModel。我能够重现这种行为。再次重启后,我又能够再次获得引导令牌。 其他人有同样的行为吗?
答案 0 :(得分:6)
解决了这些问题:
<system.identityModel>
<identityConfiguration saveBootstrapContext="true" />
</system.identityModel>
还需要设置与{JwtBearerOptions.SaveTokens 不同的TokenValidationParameters.SaveSigninToken
,:
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions {
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new TokenValidationParameters {
SaveSigninToken = true,
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
}
}
);
答案 1 :(得分:3)
我在IIS Express中托管时遇到了这个问题。事实证明问题是我的浏览器 - 我没有关闭所有浏览器窗口或清除cookie,因此即使服务器已重新启动(现有的FedAuth cookie仍然存在),也没有使用新设置重新创建SessionSecurityToken从浏览器发送)。
一旦通过关闭所有浏览器窗口强制重新进行身份验证,重新启动浏览器并再次执行我的请求,就会出现BootstrapContext。
答案 2 :(得分:2)
如果您正在使用消息处理程序手动验证令牌,请使用JwtSecurityTokenHandler
提取声明主体并将其附加到当前主题,如Using the JWT handler for Implementing “Poor Man”’s Delegation/ActAs中所述,当您和#39;使用JwtSecurityTokenHandler.ValidateToken()
重新验证令牌,其中一个设置是TokenValidationParameters
SaveBootstrapContext
,设置true
可以解决问题。
答案 3 :(得分:0)
我使用的是 Microsoft.AspNetCore.Authentication.OpenIdConnect,Version=5.0.4.0,设置如下:
.AddOpenIdConnect(o =>
{
// . . .
o.TokenValidationParameters.SaveSigninToken = true;
})