使用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参数的方法