大家好:我正在编写一个基于C#的SignalR客户端,它与需要Forms身份验证的IIS服务器后面的SignalR服务器进行交互。根据用户凭据,服务器返回持久性和非持久性故障单,其过期时间为30分钟(安全事项不使用滑动过期)。
在客户端,我得到了票证,我可以看到,当使用正确的用户时,它被标记为持久的,虽然它的有效期比创建日期早30分钟。我将cookie分配给HubConnection(使用CookieContainer.Add方法),一切正常,直到故障单过期。
即使是持久性的,当故障单过期时,它会从HubConnection CookieContainer中删除,在我使用新票证创建全新连接之前,我无法再次连接到服务器。
更新
在仔细调试问题之后,似乎IIS7和IIS8服务器未正确处理持久性票证:虽然它们是生成持久性的(属性FormsAuthenticationTicket.IsPersistent为true)但它们带有到期日期(属性FormsAuthenticationTicket)。到期包含将票证超时添加到FormsAuthenticationTicket.IssueDate属性的结果),实际上它们在票证超时后到期,因此每个SignalR集线器方法调用都会返回Unathorized(HTTP代码401)错误。这是使用的web.config配置:
<system.web>
<authentication mode="Forms">
<forms loginUrl="Auth/Ticket.aspx" defaultUrl="/" slidingExpiration="false" timeout="30"/>
</authentication>
</system.web>