如何从SignalR Hub获取OwinContext?

时间:2017-12-05 21:10:07

标签: asp.net-mvc asp.net-mvc-5 signalr asp.net-identity owin

我有一个ASP.NET MVC 5应用程序,它使用c#编写在ASP.NET MVC 5框架的顶部。

在这个应用程序中,我使用SignalR在我的应用程序和用户的浏览器之间创建WebSocket连接。

在我的SignalR中心,我希望能够访问OwinContext对象。

如何从集线器访问OwinContext对象?

这就是我试过的

Context.Request.GetHttpContext().GetOwinContext();

但是,这给了我以下错误

  

在上下文中找不到owin.Environment项目。

我将<add key="owin:AutomaticAppStartup" value="true" />添加到我的Web.Config文件中。

这就是Startup类的样子

using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
using System;

[assembly: OwinStartup(typeof(TestProject.App_Start.Startup))]
namespace TestProject.App_Start
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=316888
            ConfigureAuth(app);

            // Any connection or hub wire up and configuration should go here
            app.MapSignalR();
        }
        public void ConfigureAuth(IAppBuilder app)
        {
            // need to add UserManager into owin, because this is used in cookie invalidation
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = Settings.ApplicationCookie,
                LoginPath = new PathString("/Login"),
                Provider = new CookieAuthenticationProvider(),
                CookieName = Settings.ApplicationCookieName,
                CookiePath = Settings.CookiePath,
                CookieHttpOnly = true,
                SlidingExpiration = true,
                ExpireTimeSpan = TimeSpan.FromHours(24),
            });
        }
    }
}

更新案例使用说明

在某些情况下,我需要从Hub内部更新用户声明。这需要通知Authentication Manager有关新的声明。所以我使用以下方法更新ClaimsIdentity

private static void InformAuthManager(ClaimsIdentity identity, HttpContextBase context = null)
{
    IAuthenticationManager authenticationManager;

    if (context != null)
    {
        authenticationManager = context.GetOwinContext().Authentication;
    }
    else
    {
        authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
    }

    var claims = new ClaimsPrincipal(identity);
    var authProperties = new AuthenticationProperties() { IsPersistent = true };
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant(claims, authProperties);
}

0 个答案:

没有答案