嗨,我正在尝试使用承载认证设置信号器 . 当我调试Requesttoken方法时,成功接收到承载令牌 . 但是当我的信号器客户端使用承载令牌调用受保护(授权)方法时,他就不会被认证 . 我还尝试实现自定义AuthorizeAttribute,但AccessTokenFormat.Unprotect始终返回null .

错误信息:

Caller is not authorized to invoke the Send method on Hub.

Build :

  • Web Api项目
  • Web Api项目中的信号中心
  • 信号器的启动配置

信号器启动配置:

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);
     }
}