使用SignalR 2.XX,Context.User.Identity.Name为null如何解决?

MRF*_*ius 42 authentication asp.net-mvc signalr signalr-hub owin

这让我疯了.

我正在使用最新的signalR版本(2.0.2).这是我的集线器代码(OnConnected)

        public override Task OnConnected()
        {
            //User is null then Identity and Name too.
            Connections.Add(Context.User.Identity.Name, Context.ConnectionId);
            return base.OnConnected();
        }
Run Code Online (Sandbox Code Playgroud)

这是我的Controller的登录方法:

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
              var user = await UnitOfWork.UserRepository.FindAsync(model.UserName,  model.Password);

                if (user != null)
                {
                    await SignInAsync(user, model.RememberMe);

                    return RedirectToLocal(returnUrl);
                }
            }

            TempData["ErrorMessage"] = Resources.InvalidUserNameOrPassword;

            // If we got this far, something failed, redisplay form
            return RedirectToAction("Index","Home");
        }
Run Code Online (Sandbox Code Playgroud)

我发现有些人在OnDisconnected上遇到这个问题,我甚至都没有.

我正在使用MCV5模板.

你知道什么是错的吗?

MRF*_*ius 96

我找到了最终解决方案,这是我的OWIN启动类的代码:

        public void Configuration(IAppBuilder app)
        {
        app.MapSignalR();

        // Enable the application to use a cookie to store information for the signed i user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Home/Index")
        });

        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseMicrosoftAccountAuthentication(new MicrosoftProvider().GetAuthenticationOptions());
        app.UseTwitterAuthentication(new TwitterProvider().GetAuthenticationOptions());
        app.UseFacebookAuthentication(new FacebookProvider().GetAuthenticationOptions());
        app.UseGoogleAuthentication(new GoogleProvider().GetAuthenticationOptions());    
    }
Run Code Online (Sandbox Code Playgroud)

让自己喝点咖啡,我想"在身份验证后映射SignalR怎么样,瞧! 现在它的工作符合预期.

        public void Configuration(IAppBuilder app)
        {
        // Enable the application to use a cookie to store information for the signed i user
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Home/Index")
        });

        // Use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
        app.UseMicrosoftAccountAuthentication(new MicrosoftProvider().GetAuthenticationOptions());
        app.UseTwitterAuthentication(new TwitterProvider().GetAuthenticationOptions());
        app.UseFacebookAuthentication(new FacebookProvider().GetAuthenticationOptions());
        app.UseGoogleAuthentication(new GoogleProvider().GetAuthenticationOptions());

        app.MapSignalR();    
    }
Run Code Online (Sandbox Code Playgroud)

  • 男人,这是疯狂的,你自己没有提供信息.谢谢.在我的模板中它必须是这样的:public void Configuration(IAppBuilder app){ConfigureAuth(app); app.MapSignalR(); } (5认同)

Jos*_*Noe 5

如果您在同一个项目中使用Web Api和SignalR,则必须注册Web Api 之前映射SignalR .

改变这个:

app.UseWebApi(GlobalConfiguration.Configuration);
app.MapSignalR();
Run Code Online (Sandbox Code Playgroud)

对此:

app.MapSignalR();
app.UseWebApi(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)

  • @MRFerocius你提供的答案类似但不同.你的答案是在身份验证下移动`app.MapSignalR()`.我的目的是将它移到**app.UseWebApi()`之上.使用Web Api和SignalR的人可能会发现这些信息很有用,因为它不直观. (5认同)