我已经使用asp.net身份验证实现了asp.net mvc。
我使用过基于cookie的身份验证。重新启动IIS /停止并启动我的站点的IIS后,当我打开我的网站时,用户将自动登录到系统。
用户cookie未清除且仍对用户有效。重启iis后如何强制用户注销?
我使用过网站的默认样本。 http://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples
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))
}
});
答案 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中进行身份验证强>
如果会话无效,则使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" }
});
}
}
}
}
在Global.asax文件中
添加以下代码
GlobalFilters.Filters.Add(new SessionHandler());