web-dev-qa-db-ja.com

Context.User.Identity.Nameは、SignalR 2.X.Xではnullです。修正方法

これは私を狂気にさせています。

最新の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テンプレートを使用しています。

何が悪いのかご存知ですか?

39
MRFerocius

私は最終的な解決策を見つけました、これは私の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();    
    }
94
MRFerocius

同じプロジェクトでWeb ApiとSignalRを使用している場合、SignalRをマッピングする必要がありますbefore Web Apiを登録します。

これを変える:

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

これに:

app.MapSignalR();
app.UseWebApi(GlobalConfiguration.Configuration);
5
Josh Noe

/signalrを「分岐パイプライン」としてマッピングする場合、これを行う必要があります。 appではなくbp.UseCookieAuthenticationを使用してください:

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

ヒント:大文字小文字を慎重に変更したため、URLバーにyouRaccountが表示されたときに動作することがわかりました:-)

2
Simon_Weaver

必ず認証を確認してください。構成は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();


    }
}

抱擁 ..

2
islam khateeb

.NET Core SignalRのみ

新しい.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」を検索してください。これを自分で追加しなければならないという意味では少し厄介ですが、だからこそ見逃しがちです。

0
Simon_Weaver