为什么Xamarin中的Context.User.Identity.Name为空?

为什么Xamarin中的Context.User.Identity.Name为空?,xamarin,signalr,Xamarin,Signalr,当我尝试从Xamarin Context.User.Indetity.Name进行连接时,我不明白为什么是空的。我有什么特别需要做的吗?我登录到服务器,用户已建立连接。之后,我使用以下代码: var Connection = new HubConnection(Url); _hub = Connection.CreateHubProxy(hubName); _hub.On(srvEvent, onData); await Connection.Start(); 但我从来没有得到用户名。我做错

当我尝试从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服务器进行身份验证,因此我必须以某种方式将访问令牌传递给Signal,因为Signal使用web套接字来回传递消息,我无法在标头中传递访问令牌,因为web套接字不支持这一点

我以这种方式将访问令牌作为查询字符串参数传递(Javascript客户端)

然后在我的signar上添加了一个中间件,它接受该查询字符串,并使用承载令牌将其作为授权头添加到头中。在我的创业课上就是这样做的

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.UseIdentityServerBearerTokenAuthentication(
               new IdentityServerBearerTokenAuthenticationOptions
               {
                   Authority = ConfigurationManager.AppSettings["api:idserver"],
                   RequiredScopes = new[]
                   {
                            "chat-hub"
                   }
               });
所有这些设置完成后,我可以访问Context.User.Identity.Name,如果您想获得其他标识,可以这样做

var identity = Context.User.Identity as ClaimsIdentity;
我正在使用上面的代码来获取如下的subjectId(userid)

            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);        
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 };
        }

我希望这能有所帮助

你对信号机使用什么样的身份验证?@JGEstevez对不起,我是信号机新手,有这样的事情吗?我以为它就像web部件一样。我认为它应该共享上下文。是的,你需要用authorize属性装饰你的hub或其中一个hub函数,然后在startup类中,你需要像为web api或mvc项目配置身份验证一样配置身份验证在我的情况下,我使用signalr进行聊天,该聊天将在网站、android应用程序和ios应用程序中使用,这些应用程序还使用了一个受OAuth2服务器保护的api,因此对于我的Signaler,我使用相同的OAuth2服务器进行身份验证,但我需要将访问令牌传递给signalr,以便验证可以工作,我有一个代码,您可以用作指南,如果需要,请告诉我it@JGEstevez好的,谢谢。我要检查一下authorize属性是否解决了这个问题。谢谢
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 };
        }