これは私を狂気にさせています。
最新の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();
}
そして、これは私のコントローラーのログイン方法です:
[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");
}
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());
}
自分でコーヒーを作って、私は"認証後の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();
}
同じプロジェクトでWeb ApiとSignalRを使用している場合、SignalRをマッピングする必要がありますbefore Web Apiを登録します。
これを変える:
app.UseWebApi(GlobalConfiguration.Configuration);
app.MapSignalR();
これに:
app.MapSignalR();
app.UseWebApi(GlobalConfiguration.Configuration);
/signalr
を「分岐パイプライン」としてマッピングする場合、これを行う必要があります。 app
ではなくbp.UseCookieAuthentication
を使用してください:
app.Map("/signalr", bp =>
{
bp.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/store/youRaccount/login")
});
ヒント:大文字小文字を慎重に変更したため、URLバーにyouRaccount
が表示されたときに動作することがわかりました:-)
必ず認証を確認してください。構成はapp.MapMignalrR()を開始する前に呼び出されます
これを変えた
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 Core SignalRの完全な手順では、websocketを使用する場合、クエリ文字列からaccessTokenを手動で引き出す必要があることを説明しています。これは見逃しがちです。
https://docs.Microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-2.2
基本的にAddAuthentication()
を呼び出す場所では、AddJwtBearer()
を追加し、OnMessageReceived
ハンドラーのハンドラーを設定する必要があります。
上記のコードのコードで「OnMessageReceived」を検索してください。これを自分で追加しなければならないという意味では少し厄介ですが、だからこそ見逃しがちです。