为啥 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