以下3种检索索赔的方法有何不同?
在ApiController中调用:
((ClaimsIdentity) HttpContext.Current.User.Identity).Claims
((ClaimsIdentity) Thread.CurrentPrincipal.Identity).Claims
((ClaimsIdentity) User.Identity).Claims
前两个属性存储了相同的数据,但最后一个属性存储了上一个会话的数据。
UserCache.Instance.Clear();
FederatedAuthentication.SessionAuthenticationModule.SignOut();
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(string.Empty), null);
混合WebForms,WebApi,MVC应用程序
大多数应用程序都是使用WebForms构建的。
答案 0 :(得分:1)
如果您使用的是WebApi,则HttpContext.Current
不应直接提供(see this answer)。所以我猜你也在使用MVC,你会看到MVC上下文。
Thread.CurrentPrincipal
使用起来很危险,因为它包含线程原则,这可能是您从未预料到的,例如实际运行IIS(AppPool用户)的用户。大多数时候,这是你的想法,但有时它不是。这将导致你无休止的追逐,你永远无法重建自己。
User.Identity as ClaimsIdentity
是获取所需内容的正确方法,它在VS的默认模板中使用。但是,如果您看到来自"之前会话的数据" - 表示您的cookie未正确清除。注销用户的方式看起来很可疑:
UserCache.Instance
?SignOut
方法实际上并未注销用户。因此,如果您拨打此电话然后在同一请求中检查用户身份,则您将完整地看到相同的身份。HttpContext.Current.User
不会在请求中给您太多。如果我们谈论纯WebAPI,请参阅第一点。默认退出是通过IAuthenticationManager
private IAuthenticationManager Authentication
{
get { return Request.GetOwinContext().Authentication; }
}
[Route("Logout")]
public IHttpActionResult Logout()
{
Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);
return Ok();
}
尝试此操作然后根据您的需要进行调整。