C# 是否可以在不在SignalR 2.0.x中创建新连接的情况下更新当前IPrincipal?

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并创建一个新的自

我们在MVC4中使用自定义表单身份验证。我们使用自定义数据(后端子系统的另一个身份验证票证)创建FormsAuthenticationTicket,并将其存储在cookie中。此cookie在global.asax中的FormsAuthentication_onAuthentication方法中读取和取消类型化。从解密的数据中,我们创建一个自定义的IPrincipal对象,并将其设置为当前用户

我们还对票据使用滑动过期方案,如果票据即将过期,我们将创建一个新票据,更新cookie并创建一个新的自定义IPricipal对象

我们已将ut信号器设置为定期ping服务器,并且票证已正确更新。 问题是更新后的IPrincipal从未传播到SignalR(它只是第一次设置)。这是可能的,还是我们需要在续订票证时创建新连接

    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就太好了。