Asp.net身份 - 在iis上重置cookie和会话回收(重启)

时间:2016-09-23 11:38:47

标签: c# asp.net iis asp.net-identity

我已经使用asp.net身份验证实现了asp.net mvc。

我使用过基于cookie的身份验证。重新启动IIS /停止并启动我的站点的IIS后,当我打开我的网站时,用户将自动登录到系统。

用户cookie未清除且仍对用户有效。重启iis后如何强制用户注销?

我使用过网站的默认样本。 http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

enter image description here

app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

2 个答案:

答案 0 :(得分:2)

重新启动IIS时,Cookie不会失效 - 这不是HTTP协议的工作方式。在IIS重新启动时无效的Cookie可能会导致生产中出现一些奇怪的行为 - IIS可能会随时出现问题,或者可能存在使用少量IIS服务器来处理请求的负载均衡器 - 如果其中一个服务器重新启动会发生什么?

无论如何,您可以通过在数据库中批量更新ApplicationUser.SecurityStamp来杀死所有用户的所有cookie。并且在Startup.Auth.cs设置validateInterval: TimeSpan.FromMinutes(2) - 这将在SecurityStamp更新的2分钟内使所有Cookie无效。建议不要低于此值 - 这会导致性能问题。

答案 1 :(得分:0)

为此,我做了一个技巧。

我们正在使用会话存储动态变量 asp.net身份,以便在 ASP.NET MVC中进行身份验证

  1. 我打断了每个请求。
  2. 我检查过asp.net身份是否有效且会话无效。
  3. 如果会话无效,则使Cookie无效并将用户导航到特定页面。

    public class SessionHandler : ActionFilterAttribute
    {
        private ApplicationUserManager _userManager;
        private IAuthenticationManager AuthenticationManager
        {
            get
            {
                return HttpContext.Current.GetOwinContext().Authentication;
            }
        }
        public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            }
            private set
            {
                _userManager = value;
            }
        }
        public IIdentity UserIdentity
        {
            get { return System.Web.HttpContext.Current.User.Identity; }
        }
    
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
    
            if (!string.IsNullOrWhiteSpace(UserIdentity.GetUserId()))
            {
                if (System.Web.HttpContext.Current.Session["Username"] == null)
                {
                    AuthenticationManager.SignOut();
                    filterContext.Result = new RedirectToRouteResult(
                                  new RouteValueDictionary
                                  {
                                       { "action", "Index" },
                                       { "controller", "Home" }
                                  });
                }
            }
        }
    }
    
  4. 在Global.asax文件中

    添加以下代码

    GlobalFilters.Filters.Add(new SessionHandler());