首页 文章

是否可以更新当前的IPrincipal而无需在SignalR 2.0.x中创建新连接?

提问于
浏览
1

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

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

我们已经设置了SignalR来定期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;
    }

1 回答

  • 1

    如果要更新SignalR连接的当前IPrincipal,则需要创建新连接 .

    原因非常简单:SignalR请求可以无限期地持续 .

    发送Cookie并在请求开始时进行身份验证/授权 . 这也是IPrincipal设置的时候 . 至少在SignalR中,IPrincipal存储在request itself上 .

    我想如果您有对给定用户的活动SignalR请求的引用,可能会更新IPrincipal,但我认为最好的办法是在IPrincipal更改时 Build 新的SignalR连接 .

相关问题