Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript客户端进行信号器身份验证_Javascript_Authentication_Signalr_Asp.net Mvc 5 - Fatal编程技术网

使用javascript客户端进行信号器身份验证

使用javascript客户端进行信号器身份验证,javascript,authentication,signalr,asp.net-mvc-5,Javascript,Authentication,Signalr,Asp.net Mvc 5,我正在玩MVC5和signar中的openauthentication。我使用javascript客户机在signal上调用一个简单的服务器方法,并从服务器接收回复。它工作得很好,但是如果我添加[Authorize]标记,它甚至不会调用服务器方法(调试时没有得到任何响应) 我的假设是服务器将使用身份验证机制来质询客户机。我遗漏了什么吗?我是否必须从客户端手动对用户进行身份验证?如果是,如何传递身份验证令牌 这是我的hub: [HubName("authChatHub")] pub

我正在玩
MVC5
signar
中的
openauthentication
。我使用javascript客户机在
signal
上调用一个简单的服务器方法,并从服务器接收回复。它工作得很好,但是如果我添加
[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();
        }
下面是使用代码启用CORS的
Startup.cs

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);
            });
        }
    }
最后,这个
客户端
端代码调用
hub
方法并侦听服务器RPC

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

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

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


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

信号器本身不处理身份验证


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

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


有一个示例

您可以将身份验证令牌添加到querystring中,当java脚本客户端初始化与signalr server的连接时,它将被传递到服务器

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


服务器端:
var-Token=IRequest.QueryString[“Token”]

我看到了那个页面,我不清楚的是如何在javascript客户端中授权用户。百万美元的问题是,您使用的是什么身份验证方案?如果答案是“我不知道”,那就是问题所在。有基于cookie的身份验证(表单身份验证)、基本身份验证、windows身份验证。。这个名单还有很多。一旦你知道你使用的是什么身份验证方案,我们就可以讨论[Authorize]属性。我正在尝试使用MVC5附带的Google auth,我在Startup.auth.cs中有问题的代码。请确保在调用后调用MapSignalConfigureAuth@dfowler,我会试试,但你能解释一下auth应该如何工作吗。对于javascript客户端(例如,移动设备中的html5/js应用程序),我是否必须进行身份验证,然后手动将令牌添加到请求头中?这完全不是我想要做的。我就信号器身份验证和授权进行了长时间的讨论。我可以说,signer并不停留在身份验证或授权上。我已经更新了上面的答案,希望能有所帮助。你可能还想看看这篇文章。这是行不通的。此时,
AuthorizeEchoHub.cshtml
调用
startSignalR()
,但没有接受0参数的方法