oauth-2.0 - 连接 Auth token 并将其传递到启用了 CORS 的 SignalR 集线器

标签 oauth-2.0 signalr cors asp.net-web-api2

我有三个 ASP.NET WebAPI 端点:

  • 身份服务器,生成不记名 token (serverA.com);
  • 带集线器的 SignalR 服务器 (serverB.com);
  • 一些带有简单 ASP.NET MVC View 和 SignalR JS 客户端脚本 (serverC.com) 的端点。

  • 三台服务器都使用 OAuth2 中间件作为 Auth 机制。 Microsoft.Owin.Cors 也已配置。
    服务器仅使用 HTTPS 请求。
    SignalR v2.2.0 安装在 serverB.com 上。

    我可以成功地从 serverC.com 向 serverA.com 发出跨域请求以获取承载 token ,但实际上,我不知道如何在连接到 serverB.com 时传递身份验证 token

    到目前为止,我发现了两种方法:
  • 将身份验证 token 作为查询字符串传递(不安全);
  • 将此设置应用于 jQuery.ajax

    $.ajaxSetup({
    发送前:函数(xhr){
    xhr.setRequestHeader('tokenKey', 'tokenValue');
    }});

  • 但它强制 SignalR 仅使用长轮询。

    是否有任何其他方式发送身份验证 token (不在查询字符串中),以便 OAauth BearerAuthorizationProvider 可以使用和验证它?也许,cookie,标题或任何其他方式?

    更新

    为两种环境设置的 CORS 中间件允许所有数据并接受凭据。

    这是我的 OWIN 中间件:
    var requestUri = context.Request.Uri.AbsolutePath;
    if (string.Equals(requestUri, authRoute, StringComparison.OrdinalIgnoreCase))
    {
         if (!context.Request.Headers.ContainsKey("Authorization") || string.IsNullOrEmpty(context.Request.Headers["Authorization"]))
         {
               context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
         }
         else
         {
               context.Response.Cookies.Append("BearerToken", context.Request.Headers["Authorization"]);
         }
      }
      else
      {
          await Next.Invoke(context);
      }
    

    然后我做第一个 Ajax 请求:
    $.ajax({
            url: self.communicationHubUrl + '/authenticate',
            type: 'post',
            cache: false,
            crossDomain: true,
            beforeSend: function(xhr) {
                 xhr.setRequestHeader('Authorization', self.accessToken);
           });
    

    中间件将身份验证 token 从 header 设置为响应 cookie。

    然后我调用 hub.Start 以便 SignalR 开始发送 ajax 请求。

    但是由于某些我不太明白的原因,只有当我通过 $.ajaxSetup 为所有 ajax 请求启用 xhr.withCredentials = true 时,cookie 才会出现在请求中
            $.ajaxSetup({
                xhrFields: {
                    withCredentials: true
                }
            });
    

    没有此设置的请求不包括 cookie。另一方面,我认为强制所有 ajax 请求启用此类设置并不是一个好的决定。

    此外,我在 Oauth 中间件中遇到了奇怪的行为:当来自 signalR 的请求到来时,不会调用 ValidateIdentity 方法,所以我得到了默认的主体,而不是 401 Unauthorized。

    最佳答案

    我认为将身份验证 token 放入 cookie 将是您最好的选择。与 ajaxSetup 选项不同,cookie 与 EventSource 和 WebSocket 请求一起发送。

    您可能需要向 SignalR 服务器 (serverB.com) 添加一些中间件,以便在启动 SignalR 连接之前 POST auth token 时设置适当的 cookie。

    关于oauth-2.0 - 连接 Auth token 并将其传递到启用了 CORS 的 SignalR 集线器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25120766/

    相关文章:

    oauth-2.0 - OAuth 2.0 重定向 URL 中是否支持查询字符串参数?

    azure - Azure API 管理服务中的 "JWT Validation Failed: JWT not present.."

    c# - 部署在远程机器上时 SignalR 不工作

    php - 返回 HTTP 405 的 CORS 预检请求

    java - 如何修复此 Oauth 2.0 重定向错误

    signalr - SignalR 在 DDD 架构中属于哪里?

    c# - 使用 SignalR 2 和 MVC 4.0 从服务器向特定客户端发送消息不起作用

    angularjs - CORS 已启用,但仍然出现 CORS 错误

    php - CORS header 在浏览器中被更改,导致内容被阻止

    python - 使用 urllib2 进行简单 https 身份验证时出现问题(获取 PayPal OAUTH 不记名 token )