C# 是否可以在不在SignalR 2.0.x中创建新连接的情况下更新当前IPrincipal?
我们在MVC4中使用自定义表单身份验证。我们使用自定义数据(后端子系统的另一个身份验证票证)创建FormsAuthenticationTicket,并将其存储在cookie中。此cookie在global.asax中的FormsAuthentication_onAuthentication方法中读取和取消类型化。从解密的数据中,我们创建一个自定义的IPrincipal对象,并将其设置为当前用户 我们还对票据使用滑动过期方案,如果票据即将过期,我们将创建一个新票据,更新cookie并创建一个新的自定义IPricipal对象 我们已将ut信号器设置为定期ping服务器,并且票证已正确更新。 问题是更新后的IPrincipal从未传播到SignalR(它只是第一次设置)。这是可能的,还是我们需要在续订票证时创建新连接C# 是否可以在不在SignalR 2.0.x中创建新连接的情况下更新当前IPrincipal?,c#,asp.net,asp.net-mvc-4,cookies,signalr,C#,Asp.net,Asp.net Mvc 4,Cookies,Signalr,我们在MVC4中使用自定义表单身份验证。我们使用自定义数据(后端子系统的另一个身份验证票证)创建FormsAuthenticationTicket,并将其存储在cookie中。此cookie在global.asax中的FormsAuthentication_onAuthentication方法中读取和取消类型化。从解密的数据中,我们创建一个自定义的IPrincipal对象,并将其设置为当前用户 我们还对票据使用滑动过期方案,如果票据即将过期,我们将创建一个新票据,更新cookie并创建一个新的自
protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e)
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null)
return;
var ticketManager = DependencyResolver.GetService(typeof(ITicketManager)) as ITicketManager;
var ticket = ticketManager.DecryptAndValidateTicket(authCookie.Value);
var newTicket = ticketManager.RefreshTicketIfNeeded(ticket);
if (newTicket != null) {
var cookie = ticketManager.CreateCookie(newTicket);
e.Context.Response.Cookies.Add(cookie);
ticket = newTicket;
}
var user = ticketManager.Authenticate(ticket);
Thread.CurrentPrincipal = user;
HttpContext.Current.User = user;
e.User = user;
}
如果要更新信号器连接的当前IPrincipal,则需要创建新连接 原因很简单:信号器请求可以无限期地持续 发送cookie,并在请求开始时进行身份验证/授权。这也是设置IPrincipal的时候。至少在signar中,IPrincipal存储在
我想,如果您有对给定用户的活动信号器请求的引用,则可能会更新IPrincipal,但我认为如果IPrincipal发生更改,您最好的选择是建立一个新的信号器连接。谢谢!正如我所预料的,但我认为如果信号员在每次ping上更新IPrincipal就太好了。