Asp.net mvc Context.User.Identity.Name为null,信号器为2.X.X。如何修复它?
这快把我逼疯了 我使用的是最新的信号器版本(2.0.2)。这是我的集线器代码(未连接) 这是我的控制器的登录方法: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) {
[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();
}
}