您好我正在尝试使用承载身份验证设置信号器。当我调试Requesttoken方法时,成功接收到承载令牌。但是当我的信号器客户端使用持有者令牌调用受保护(授权)方法时,他没有经过身份验证。我还尝试实现自定义AuthorizeAttribute,但AccessTokenFormat.Unprotect总是返回null。
错误讯息:
Caller is not authorized to invoke the Send method on Hub.
设定:
Signalr Startup Config:
app.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
map.UseOAuthAuthorizationServer(OAuthOptions);
map.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
Provider = new SignalrOAuthProvider()
});
var configuration = new HubConfiguration(){
EnableDetailedErrors = true
};
map.RunSignalR(configuration);
});
自定义OAuthprovider,它从cookie或查询字符串中读取持有者令牌
public class SignalrOAuthProvider : OAuthBearerAuthenticationProvider
{
public override Task RequestToken(OAuthRequestTokenContext context)
{
// var value = context.Request.Query.Get("bearer");
var value = context.OwinContext.Request.Cookies["BearerToken"];
if (!string.IsNullOrEmpty(value))
{
context.Token = value;
}
return Task.FromResult(null);
}
}
答案 0 :(得分:0)
确保在集线器上使用[System.Web.Http.Authorize]属性。然后在标题中传递Bearer令牌。
授权:承载“您的令牌”