使用javascript客户端进行SignalR身份验证

时间:2014-01-17 21:30:36

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

我正在玩open authenticationMVC5中的SignalR。我使用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); };

4 个答案:

答案 0 :(得分:2)

您必须像使用任何其他asp.net应用程序一样使用Forms或Windows身份验证。一旦通过身份验证,您的呼叫将以与将[Authorize]属性放在集线器上之前相同的方式工作。

SignalR本身并不处理身份验证。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

有一个示例here

答案 3 :(得分:-1)

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

将Authorize属性应用于集线器类时,指定的授权要求将应用于集线器中的所有方法

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