为啥 SignalR Context.User.Identity.Name 为空?

Posted

技术标签:

【中文标题】为啥 SignalR Context.User.Identity.Name 为空?【英文标题】:Why is SignalR Context.User.Identity.Name empty?为什么 SignalR Context.User.Identity.Name 为空? 【发布时间】:2018-06-25 14:48:09 【问题描述】:

This question 帮助我修复了一个空的 Context.User 值,但修复后,Context.User.Identity.Name 为空。

这是我在 Context.User.Identity 的即时窗口中看到的内容:

System.Security.Principal.WindowsIdentity
    AccessToken: Microsoft.Win32.SafeHandles.SafeAccessTokenHandle
    Actor: null
    AuthenticationType: ""
    BootstrapContext: null
    Claims: System.Security.Principal.WindowsIdentity.<get_Claims>d__95
    CustomSerializationData: null
    DeviceClaims: Count = 0
    Groups: null
    ImpersonationLevel: Anonymous
    IsAnonymous: true
    IsAuthenticated: false
    IsGuest: false
    IsSystem: false
    Label: null
    Name: ""
    NameClaimType: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name"
    Owner: null
    RoleClaimType: "http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid"
    Token: 0
    User: null
    UserClaims: Count = 0

我怀疑 IsAuthenticated: false 与它有关,但我的身份验证是在 SalesForce 包装器中处理的,而不是通过典型的 FormsAuthentication.SetAuthCookie() 代码 - 我搜索了我的存储库,我们不使用 SetAuthCookie任何地方。根据我在本地主机网页中看到的内容,我已成功通过身份验证。

必须做些什么来填充/​​访问身份Name

【问题讨论】:

【参考方案1】:

我认为您对 IsAuthenticated 属性的怀疑是正确的。如果您在没有任何类型的令牌 (OAuth/JWT)、cookie、Windows 身份验证等的情况下调用集线器(或 Web API),则不会填充声明/身份信息。 Here's SignalR 集线器身份验证/授权概述。我已成功使用 Signalr 集线器上的授权过滤器(包含在 Microsoft.AspNet.SignalR 中的过滤器)以及调用中传入的 Bearer 令牌:

 var connection = new HubConnection("http://localhost:50042/signalr");
 connection.Headers.Add("Authorization", "Bearer " + token);

授权过滤器很早就在 Web api 管道中被调用。令牌将被解密并设置线程原则/身份。但是,这个令牌是由我的 web api 发出的,所以它可以被解析。

我没有任何 Salesforce 经验,但是,听起来您的应用程序设置与我最近所做的有点不同。我假设您的应用程序正在针对 SalesForce API 进行身份验证。然后,必须使用从 Salesforce 返回的该令牌来验证/授权调用,以防止对 Salesforce API 的后续调用。但是,您无法解密/解析该令牌以提取声明(希望如此。否则这不好)。

您是否尝试过使用 Salesforce 的 JWT(请参阅 here)?还是使用 Web API,利用外部身份验证(例如 here)?您可能可以在您的客户端和我假设托管信号器集线器的 .NET Web Api 之间来回传递 JWT,并使用自定义授权过滤器来解析 JWT 令牌以授权对集线器的调用/设置身份(请参阅this *** 帖子开始)。

希望这能让你继续前进。

【讨论】:

以上是关于为啥 SignalR Context.User.Identity.Name 为空?的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs vs SignalR:为啥我们需要服务器端 javascript?

为啥 SignalR Context.User.Identity.Name 为空?

从壹开始 [Admin] 之四 || NetCore + SignalR 实现日志消息推送

SignalR.Owin 与 SignalR.SelfHost

SignalR全套系列之在.Net6中实现SignalR分组通信

SignalR系列教程:SignalR快速入门