一个会话中的不同声明

时间:2015-02-09 16:12:20

标签: asp.net asp.net-identity

以下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构建的。

1 个答案:

答案 0 :(得分:1)

如果您使用的是WebApi,则HttpContext.Current不应直接提供(see this answer)。所以我猜你也在使用MVC,你会看到MVC上下文。

Thread.CurrentPrincipal使用起来很危险,因为它包含线程原则,这可能是您从未预料到的,例如实际运行IIS(AppPool用户)的用户。大多数时候,这是你的想法,但有时它不是。这将导致你无休止的追逐,你永远无法重建自己。

User.Identity as ClaimsIdentity是获取所需内容的正确方法,它在VS的默认模板中使用。但是,如果您看到来自"之前会话的数据" - 表示您的cookie未正确清除。注销用户的方式看起来很可疑:

  1. 什么是UserCache.Instance
  2. 在请求完成之前,
  3. SignOut方法实际上并未注销用户。因此,如果您拨打此电话然后在同一请求中检查用户身份,则您将完整地看到相同的身份。
  4. 分配HttpContext.Current.User不会在请求中给您太多。如果我们谈论纯WebAPI,请参阅第一点。
  5. 默认退出是通过IAuthenticationManager

    完成的
        private IAuthenticationManager Authentication
        {
            get { return Request.GetOwinContext().Authentication; }
        }
    
        [Route("Logout")]
        public IHttpActionResult Logout()
        {
            Authentication.SignOut(CookieAuthenticationDefaults.AuthenticationType);
            return Ok();
        }
    

    尝试此操作然后根据您的需要进行调整。