【发布时间】:2014-09-30 21:08:52
【问题描述】:
我有一个应用程序需要同时支持联合(IdP 发起)和手动身份验证(标准用户名/密码形式)。因此,我使用 .NET v4.5 System.Identity 来让应用程序声明感知。
我们在开发中看到的问题是,每当发生 AppPool 回收(如重新编译)并且我们重新加载页面或采取任何其他操作时,我们都会在尝试访问任何自定义声明时遇到错误。就好像用户仍然经过身份验证,但我们的自定义声明完全消失了。为了继续工作,我们需要关闭浏览器的所有实例并再次登录。这显然可以在野外发生,而且是我们不可能发生的事情(糟糕的最终用户体验)。
是否有我们做错了什么或者我们可以捕获/检测这种情况并强制用户重新登录的方法?
背景
在手动登录的情况下,我们构建一个 CustomClaimsIdentity 实例,该实例被传递到一个新的 ClaimsPrincipal 中,然后用于创建一个新的 SessionSecuirytToken 实例,然后写出如下:
var claims = CustomClaimsAuthenticationManager.BuildClaimsList( user );
var identity = new UniversalIdentity( claims, AuthenticationTypes.Password );
var principal = new ClaimsPrincipal( identity );
var token = new SessionSecurityToken( principal, TimeSpan.FromMinutes( user.Customer.SessionExp ?? 120 ) );
var sam = FederatedAuthentication.SessionAuthenticationModule;
sam.WriteSessionTokenToCookie( token );
在 Idp-Initiated 登录的情况下,我们处理 FederatedAuthentication.WSFederationAuthenticationModule.SignedIn 事件并执行检查以验证提供的声明以及构建我们的应用添加到身份的自定义声明与手动身份验证相同。
【问题讨论】:
-
我进一步缩小了这个范围,似乎我的一个静态助手类正在尝试访问
Thread.CurrentPrincipal,它只是一个IPrincipal,而不是ClaimsPrincipal。有没有办法将Thread.CurrentPrincipal对象变成ClaimsPrincipal?
标签: c# identity claims-based-identity ws-federation