BootstrapContext在ClaimsIdentity上为空

8
我创建了一个使用.NET 4.5的新ASP.NET MVC应用程序。我已经成功地设置了STS身份验证。身份验证流程正常工作,我能够在Thread.CurrentPrincipal上获取包含所需声明的ClaimsIdentity。
现在,我需要引导令牌来保护对我的服务层的调用。我在identityConfiguration元素上将saveBootstrapContext设置为true。
<system.identityModel>
    <identityConfiguration saveBootstrapContext="true">

然而,ClaimsIdentity 上的 BootstrapContext 属性始终为空。
var identity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;
var context = identity.BootstrapContext; // context is always null

我有什么遗漏吗?这本来应该很简单的 :(

1
尝试使用identity = ClaimsPrincipal.Current.Identities.First() as ClaimsIdentity进行测试。 - nemesv
2
与ClaimsPrincipal.Current.Identities.First()相同的结果。它是同一个Claimsidentity实例。 - Unmesh Kondolikar
你是如何设置外部认证的?使用了WS-Federation身份验证模块吗? - leastprivilege
你搞定了吗?我加了标志,但是bootstrapcontext仍然为空。 - Jaanus
4个回答

8

通过以下方法解决:

<system.identityModel>
    <identityConfiguration saveBootstrapContext="true" />
</system.identityModel>

还需要设置TokenValidationParameters.SaveSigninToken,这与JwtBearerOptions.SaveTokens是不同的:

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    new WindowsAzureActiveDirectoryBearerAuthenticationOptions {
        Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
        TokenValidationParameters = new TokenValidationParameters {
            SaveSigninToken = true,               
            ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
        }
    }
);

这真的很有帮助!它解决了我长久以来的困惑。 - Shuping
Web.config的元素对我没有什么作用,但是 SaveSigninToken = true 对我来说非常关键。谢谢! - bkwdesign

3
我在使用IIS Express时遇到了这个问题。原来问题出在我的浏览器上 - 我没有关闭所有浏览器窗口或清除cookies,因此SessionSecurityToken没有按照新的设置重新创建,即使服务器已被重新启动(现有的FedAuth cookie仍然由浏览器发送)。
一旦我通过关闭所有浏览器窗口、重新启动浏览器并再次执行请求来强制进行重新认证,BootstrapContext就会出现。

3
如果您正在使用消息处理程序手动验证令牌,使用JwtSecurityTokenHandler提取声明原则并将其附加到当前线程,如在此处描述的使用JWT处理程序实现“穷人”的委托/ActAs,当您使用JwtSecurityTokenHandler.ValidateToken()验证令牌时,TokenValidationParameters中的一个设置是SaveBootstrapContext,将其设置为true即可。

我正在使用 System.IdentityModel.Tokens.Jwt, Version=4.0,但它不包含 SaveBootstrapContext。你有什么想法吗? - Homam
@Homam 我也遇到了同样的问题,并验证了 TokenValidationParameters.SaveToken = true 已经填充了 BootstrapContext。 - Justin Dearing

0

我正在使用 Microsoft.AspNetCore.Authentication.OpenIdConnect,版本号为 5.0.4.0,设置如下:

.AddOpenIdConnect(o =>
{
    // . . .
    o.TokenValidationParameters.SaveSigninToken = true;
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接