2016-07-18 11 views
2

Xamarinから接続しようとするとContext.User.Indetity.Nameが空である理由がわかりません。私は何か特別なことはありますか?私はサーバーにログインしており、ユーザーは接続が確立されています。その後、私は次のコードを使用しXamarinからContext.User.Identity.Nameが空の理由

var Connection = new HubConnection(Url); 
_hub = Connection.CreateHubProxy(hubName); 
_hub.On(srvEvent, onData); 

await Connection.Start(); 

をしかし、私は、ユーザー名を取得することはありません。私は間違って何をしていますか?それはないxamarinアプリから、ウェブアプリから来るとき、それが動作

var name = Context.User.Identity.Name; 
Connections.Add(name, Context.ConnectionId); 
return base.OnConnected(); 

はここでサーバーのコードです。

ありがとうございます!

+0

役に立てば幸いこの

public static string[] GetIdentityClaimsIssSub(HubCallerContext Context) { var identity = Context.User.Identity as ClaimsIdentity; if (identity == null) return null; var issuerFromIdentity = identity.FindFirst("iss"); var subFromIdentity = identity.FindFirst("sub"); if (issuerFromIdentity == null || subFromIdentity == null) return null; return new string[] { issuerFromIdentity.Value, subFromIdentity.Value }; } 

ようsubjectId(ユーザーID)を取得? –

+0

@JGEstevez申し訳ありませんが、私はSignalRを初めて使っています。私はそれがちょうどウェブの部分のようだと思った。私はそれが文脈を共有すると思った。 – eestein

+0

はい、ハブまたはあなたのハブ関数の1つをauthorize属性で飾る必要があります。スタートアップクラスでは、Web apiまたはmvcプロジェクトの場合と同じように認証を設定する必要があります。私の場合は –

答えて

5

ここに私があなたに伝えたコードがあります。

私は外部OAuth2サーバを認証に使用していますので、SignalRは何らかの理由でアクセストークンを渡す必要があります。これは、SignalRが前後のメッセージにWebソケットを使用するためです。 Webソケットではサポートされていません。

私は私のようにそのクエリ文字列を受け取り、ヘッダに追加したミドルウェアを追加しました私のSignalRに続いて、このよう(JavaScriptクライアント)クエリ文字列パラメータとして

$.connection.hub.qs = "access_token=" + mytoken; 

をそのアクセストークンを渡していますベアラトークンを使用する認証ヘッダー。これは私のスタートアップクラスで、このように行われているミドルウェアのコードは、この1つの

namespace Owin 
{ 
    public static class AuthorizationQSTokenExtractorExtension 
    { 
     public static void UseAuthQSTokenExtractor(this IAppBuilder app) 
     { 
      app.Use<AuthorizationQsTokenExtractorMiddleware>(); 
     } 
    } 
} 


namespace Chat.Middleware 
    { 
     public class AuthorizationQsTokenExtractorMiddleware : OwinMiddleware 
     { 

      public AuthorizationQsTokenExtractorMiddleware(OwinMiddleware next) 
       : base(next) 
      { 

      } 

      public override async Task Invoke(IOwinContext context) 
      { 
       Debug.WriteLine("signalr-auth-middleware"); 

       string bearerToken = context.Request.Query.Get("access_token"); 
       Debug.WriteLine("signar-bearer: " + bearerToken); 
       if (bearerToken != null) 
       { 
        TokenHelper.DecodeAndWrite(bearerToken); 
        string[] authorization = { "Bearer " + bearerToken }; 
        context.Request.Headers.Add("Authorization", authorization); 
       } 

       await Next.Invoke(context); 

      } 
     } 

マイ起動クラスは、あなたがに見ることができるこの

  app.UseCors(CorsOptions.AllowAll); 
      app.UseAuthQSTokenExtractor(); 

      JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 
      app.UseIdentityServerBearerTokenAuthentication(
       new IdentityServerBearerTokenAuthenticationOptions 
       { 
        Authority = ConfigurationManager.AppSettings["api:idserver"], 
        RequiredScopes = new[] 
        { 
          "chat-hub" 
        } 
       }); 

      var hubConfiguration = new HubConfiguration(); 
      hubConfiguration.EnableDetailedErrors = true;    
      app.RunSignalR(hubConfiguration);   

のように見えます

app.UseAuthQSTokenExtractor(); 

ある

上記のコードで、SignalRにOauth2 Serverを使用するように指示します。そのコードはこのコードです。

app.UseIdentityServerBearerTokenAuthentication(
       new IdentityServerBearerTokenAuthenticationOptions 
       { 
        Authority = ConfigurationManager.AppSettings["api:idserver"], 
        RequiredScopes = new[] 
        { 
          "chat-hub" 
        } 
       }); 

このすべては、私は私のContext.User.Identity.Nameへのアクセス権を持っていて、他の人があなたは私がする上そのコードを使用しています。この

var identity = Context.User.Identity as ClaimsIdentity; 

を行うことができますIdentityClaim取得したい場合に設定された後、私はそれはあなたがsignalrに使用している認証の種類を

+1

非常に参考になりました、ありがとうございます! – eestein

+0

あなたは男です。助けてくれてありがとう –

関連する問題