我无法弄清楚为什么当我尝试从Xamarin上连接Context.User.Indetity.Name为空.我需要做些什么特别的事吗?我登录到服务器并且用户已建立连接.之后我使用以下代码:
var Connection = new HubConnection(Url);
_hub = Connection.CreateHubProxy(hubName);
_hub.On(srvEvent, onData);
await Connection.Start();
但我从来没有得到用户名.我究竟做错了什么?
这是服务器的代码:
var name = Context.User.Identity.Name;
Connections.Add(name, Context.ConnectionId);
return base.OnConnected();
它适用于来自Web应用程序,而不是来自xamarin应用程序.
谢谢!
这是我告诉你的代码.
我正在使用外部OAuth2服务器进行身份验证,因此我必须以某种方式将访问令牌传递给SignalR,因为SignalR使用Web套接字来回传递消息我无法在头中传递访问令牌,因为这不受支持网络套接字.
我通过这种方式将访问令牌作为查询字符串参数传递(Javascript客户端)
$.connection.hub.qs = "access_token=" + mytoken;
然后在我的SignalR上添加了一个中间件,它接受该查询字符串并使用Bearer Token将其作为Authorization标头添加到标头中.这是在我的启动类中以这种方式完成的
app.UseAuthQSTokenExtractor();
中间件的代码就是这个
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);        
您可以在上面的代码中看到我告诉SignalR使用Oauth2服务器,该代码就是这个代码
app.UseIdentityServerBearerTokenAuthentication(
               new IdentityServerBearerTokenAuthenticationOptions
               {
                   Authority = ConfigurationManager.AppSettings["api:idserver"],
                   RequiredScopes = new[]
                   {
                            "chat-hub"
                   }
               });
设置完毕后,我可以访问我的Context.User.Identity.Name,如果你想获得其他的IdentityClaim,你可以这样做
var identity = Context.User.Identity as ClaimsIdentity;
我正在使用上面的代码来获取这样的subjectId(userid)
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 };
        }
我希望它有所帮助
| 归档时间: | 
 | 
| 查看次数: | 810 次 | 
| 最近记录: |