我正在玩open authentication
和MVC5
中的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); };
答案 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