ClaimIdentity上的BootstrapContext为null

时间:2012-12-29 16:57:21

标签: asp.net-mvc .net-4.5 wif claims-based-identity ws-federation

我用.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。我能够重现这种行为。再次重启后,我又能够再次获得引导令牌。 其他人有同样的行为吗?

4 个答案:

答案 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;
})