我有一个应用程序需要支持联合(IdP-Initiated)以及手动身份验证(标准用户名/密码表单)。因此我使用.NET v4.5 System.Identity来使应用程序声明。
我们在dev中看到的问题是,只要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 事件并执行检查以验证提供的声明以及构建我们的应用添加到身份的自定义声明与手动验证的方式相同。
答案 0 :(得分:0)
您可以安全地将IPrincipal
转换为ClaimsPrincipal
:
ClaimsPrincipal cp = (ClaimsPrincipal)Thread.CurrentPrincipal;