Asp.net mvc Context.User.Identity.Name为null,信号器为2.X.X。如何修复它?

Asp.net mvc Context.User.Identity.Name为null,信号器为2.X.X。如何修复它?,asp.net-mvc,authentication,signalr,signalr-hub,owin,Asp.net Mvc,Authentication,Signalr,Signalr Hub,Owin,这快把我逼疯了 我使用的是最新的信号器版本(2.0.2)。这是我的集线器代码(未连接) 这是我的控制器的登录方法: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Login(LoginViewModel model, string returnUrl) {

这快把我逼疯了

我使用的是最新的信号器版本(2.0.2)。这是我的集线器代码(未连接)

这是我的控制器的登录方法:

        [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");
        }
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务登录(LoginView模型,字符串返回URL)
{
if(ModelState.IsValid)
{
var user=await UnitOfWork.UserRepository.FindAsync(model.UserName,model.Password);
如果(用户!=null)
{
等待符号同步(用户,model.RememberMe);
返回重定向到本地(returnUrl);
}
}
TempData[“ErrorMessage”]=Resources.invalidUserName或密码;
//如果我们走到这一步,有些东西失败了,重新显示形式
返回重定向到操作(“索引”、“主页”);
}
我发现有些人在OnDisconnected上有这个问题,我甚至没有做到这一点

我使用的是MCV5模板


你知道怎么回事吗?

我找到了最终的解决方案,这是我的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());    
    }
给自己煮了些咖啡,我想,“验证后映射信号器怎么样?瞧!现在它按预期工作了。


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

更改此项:

app.UseWebApi(GlobalConfiguration.Configuration);
app.MapSignalR();
为此:

app.MapSignalR();
app.UseWebApi(GlobalConfiguration.Configuration);

如果要将
/signal
映射为“分支管道”,则需要执行此操作。请确保使用
bp。使用CookieAuthentication
而不是
app

app.Map("/signalr", bp =>
{
   bp.UseCookieAuthentication(new CookieAuthenticationOptions
   {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/store/youRaccount/login")
   });

提示:我已经更改了大小写,所以当我在URL栏中看到
yourcount
时,我知道它起作用了:-)

只需确保在启动app.mapmignarr()之前调用了auth.configuration

我改变了这个

 public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
        ConfigureAuth(app);



    }
}
对此

 public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        app.MapSignalR();


    }
}
拥抱..

。仅限网络核心信号机 对于较新的.NET核心信号器,完整的说明解释了当使用WebSocket时,您需要手动从查询字符串中取出accessToken 容易错过

基本上,在调用
AddAuthentication()
时,需要添加
AddJwtBearer()
,然后为
OnMessageReceived
处理程序设置一个处理程序


在上面的链接中搜索“OnMessageReceived”以查找代码。从某种意义上说,你甚至必须自己添加此代码,这有点粗糙-但这就是为什么它也很容易被忽略的原因。

即使如此,这似乎是一个很难回答的问题……信号器的所有者在哪里……我一直在读到2.0.3版在断开连接时可能会解决类似的问题,howev呃,很长一段时间都没有消息。一些对工作至关重要的事情,如安全问题,工作不正常。我运气不好。由于某种原因,如果计算机时钟不在正确的时间(例如一个月前),Context.User将为null.man,在没有提供任何信息的情况下自己访问它是疯狂的。谢谢。在我的模板中,它必须是这样的:public void配置(IAppBuilder app){ConfigureAuth(app);app.mapsigner();}@RonenFestinger我挣扎了10天,没有任何信息,当我发现这就像解决Fermats最后定理一样。疯狂:|这对我不起作用。我正在使用OwinContext和OwinContextIdentity。“给自己煮咖啡。”“-对我很有帮助)这是一年半前提供的答案。-@Ferocius先生你提供的答案相似但不同。您的答案是将app.mapsigner()移动到身份验证下方。我的任务是把它移到app.UseWebApi()上面。同时使用WebAPI和SignalR的人可能会发现这些信息很有用,因为这不是直观的。这是为我做的!谢谢谢谢你@JoshNoe我在这上面花了太多时间。这解决了我的问题。
 public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
        ConfigureAuth(app);



    }
}
 public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        app.MapSignalR();


    }
}