【问题标题】:SignalR authentication with javascript client使用 javascript 客户端的 SignalR 身份验证
【发布时间】:2014-02-07 09:29:24
【问题描述】:

我在MVC5SignalR 中使用open authentication。我使用 javascript 客户端在 SignalR 上调用一个简单的服务器方法并接收来自服务器的回复。它工作得很好,但是如果我添加[Authorize] 标签,它甚至不会调用服务器方法(调试时没有得到任何响应)。

我的假设是服务器将使用身份验证机制来挑战客户端。我错过了什么吗?我是否必须从客户端手动对用户进行身份验证,如果需要,我该如何传递身份验证令牌?

这是我的hub

    [HubName("authChatHub")]
    public class AuthChatHub : Hub
    {
        [Authorize]
        public void Ping()
        {
            Clients.Caller.Pong("Connection is FINE!!");

            Clients.Caller.Pong(Context.User == null 
              ? "Null user" 
              : Context.User.Identity.IsAuthenticated.ToString());
        }
    }

这是我的Startup.Auth.cs

    public void ConfigureAuth(IAppBuilder app)
        {
           app.UseGoogleAuthentication();
        }

这是Startup.cs,使用代码启用CORS。

public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app); //added this after a suggestion here, not sure if this is the right place. 

            app.Map("/signalr", map =>
            {
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration
                {
                    // EnableJSONP = true //empty for now
                };

                map.RunSignalR(hubConfiguration);
            });
        }
    }

最后这个client 侧代码调用hub 方法并监听服务器RPC。

this.sendMessage = () => {
            this.authChat.server.ping();
        };
this.authChat.client.pong = (message) => { console.log(message); };

【问题讨论】:

    标签: javascript authentication signalr asp.net-mvc-5


    【解决方案1】:

    您可以将您的身份验证令牌添加到查询字符串中,当 java 脚本客户端初始化与信号器服务器的连接时,该查询字符串将传递给服务器。

    客户端:connection.qs = { 'Token' : 'your token string'};

    服务器端:var Token = IRequest.QueryString["Token"];

    【讨论】:

      【解决方案2】:

      您可以使用 Bearer Token 进行身份验证,然后使用 Cookie 跟踪经过身份验证的用户。然后,您的 SignalR 请求将包含 cookie,SignalR 堆栈将识别用户并处理您的所有 [Authorize] 配置

      有一个样本here

      【讨论】:

      • 这行不通。此时AuthorizeEchoHub.cshtml调用startSignalR()但没有这样的方法接受0 arg
      【解决方案3】:

      您必须像使用任何其他 asp.net 应用程序一样使用表单或 Windows 身份验证。一旦您通过身份验证,您的调用将与在集线器上放置 [Authorize]attribute 之前的调用方式相同。

      SignalR 本身不处理身份验证。

      您必须先进行身份验证,然后将令牌发送到服务器,我认为this link 可以帮助您实现您想做的事情。

      【讨论】:

      【解决方案4】:

      在 hub 方法中指定的 Authorize 属性将使其仅对经过身份验证的用户可用。

      当您将 Authorize 属性应用于 hub 类时,指定的授权要求将应用于 hub 中的所有方法

      http://www.asp.net/signalr/overview/signalr-20/security/hub-authorization

      【讨论】:

      • 我看过那个页面,我不清楚如何在javascript客户端授权用户。
      • 百万美元的问题,您使用什么身份验证方案?如果答案是“我不知道”,那就是问题所在。有基于 cookie 的身份验证(表单身份验证)、基本身份验证、Windows 身份验证……不胜枚举。一旦你知道你正在使用什么身份验证方案,那么我们就可以讨论 [Authorize] 属性。
      • 我正在尝试使用 MVC5 附带的 Google 身份验证,我在问题中有 Startup.Auth.cs 中的代码。
      • 确保在调用 ConfigureAuth 后调用 MapSignalR
      • @dfowler,我会试试看,但请您解释一下身份验证应该如何工作。对于 javascript 客户端(例如移动设备中的 html5/js 应用程序),我是否必须进行身份验证,然后手动将令牌添加到请求标头中?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2019-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-10
      • 2014-08-07
      相关资源
      最近更新 更多