为什么SignalR Context.User.Identity.Name为空?

时间:2018-01-16 20:01:59

标签: c# asp.net asp.net-mvc signalr signalr-hub

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。我根据我在localhost网页上看到的内容成功进行了身份验证。

必须采取哪些措施来填充/访问身份Name

1 个答案:

答案 0 :(得分:1)

我认为您对IsAuthenticated属性的怀疑是正确的。如果您在没有任何令牌(OAuth / JWT),c​​ookie,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 stackoverflow帖子开始)。

希望这能让你滚动。