我正在使用带有基于cookie的身份验证的ASP.NET Identity。我正在CookieAuthenticationOptions类上设置ExpireTimeSpan,以控制在用户必须再次登录之前允许多长时间处于非活动状态。
这一切都很好,但当我将SignalR添加到应用程序时,用户在一段时间不活动后就不再需要登录了。SignalR会定期发出"ping"请求,我想正是这一点导致了cookie到期时间的延长。
我正在寻找一种不续订SignalR URL的cookie过期的方法。
我已经研究了Microsoft.Owin.Security.Cookies中的一些代码,尤其是CookieAuthenticationHandler类。AuthenticateCoreAsync方法中有逻辑来决定是否续订cookie。但是,CookieAuthenticationHandler类是内部的,所以我不能覆盖这个方法。
如果有一个钩子我可以用来做这件事,你有什么想法吗?
我们公司通过使用HttpModule从信号器响应中删除cookie来解决问题。
public class NoFormsAuthenticationModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
protected void OnPreSendRequestHeaders(object sender, EventArgs e)
{
var httpContext = ((HttpApplication)sender).Context;
var path = httpContext.Request.Path;
var noAuthentUrls = new string[] { "/signalr/" };
foreach (var url in noAuthentUrls)
{
var noAuthentication = path.IndexOf(url, StringComparison.OrdinalIgnoreCase) > -1;
if (noAuthentication)
httpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
}
}
}
希望它能帮助你。
不要忘记在web.config上添加条目:
<system.web>
<httpModules><add name="NoFormsAuthenticationModule"type="Site.Components.HttpModules.NoFormsAAuthenticationModule"/><system.webServer><模块runAllManagedModulesForAllRequests="true">
<add name="NoFormsAuthenticationModule"type="Site.Components.HttpModules.NoFormsAAuthenticationModule"/>