具有 Websocket 和 AD 身份验证的 Azure 应用服务

标签 azure signalr azure-active-directory

我们将一个应用程序部署为应用程序服务,并使用 SignalR 进行通信。启用 AAD 身份验证后 - 在浏览器中,我们开始收到 302 响应,并将位置重定向到 Azure AD。

似乎应用服务上的身份验证层忽略了查询字符串传递的access_token

请求

Request URL: wss://<url>/hubs/chat?access_token=<token>
Request Method: GET

回应

Status Code: 302 Redirect
Location: https://login.windows.net/common/oauth2/authorize?...

到处寻找后,我们找不到任何解决方案来完成这项工作。 我们看到的此问题的唯一解决方案是禁用应用服务上的身份验证或使用长池,但这两个选项在我们的情况下都是 Not Acceptable 。

最佳答案

默认情况下,您的 Web 应用程序不会从查询字符串中获取访问 token 。通常,它会从授权 header 或 cookie 中获取访问 token 。

要从查询字符串获取访问 token ,您需要实现自定义身份验证方式。

  1. 安装 Microsoft.Owin.Security.ActiveDirectory NuGet 软件包。
  2. 创建一个将从查询字符串获取访问 token 的身份验证提供程序。

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider { public override Task RequestToken(OAuthRequestTokenContext context) { var value = context.Request.Query.Get("access_token"); if (!string.IsNullOrEmpty(value)) { context.Token = value; } return Task.FromResult<object>(null); } }

  • 在 中添加 map 。
  • app.Map("/yourpath", map => { map.UseWindowsAzureActiveDirectoryBearerAuthentication(new WindowsAzureActiveDirectoryBearerAuthenticationOptions { Provider = new QueryStringOAuthBearerProvider(), Tenant = tenantId, TokenValidationParameters = new TokenValidationParameters { ValidAudience = clientId } }); map.RunSignalR(hubConfiguration); });

    关于具有 Websocket 和 AD 身份验证的 Azure 应用服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56837316/

    相关文章:

    azure - 如何在 Azure 应用服务上部署 jHipster,我收到 500 个请求超时

    asp.net - 即使我在 Windows 8 中安装了协议(protocol),SignalR 也不会使用 Websocket 协议(protocol)

    azure - 使用自定义设置配置 Azure b2C 身份验证

    javascript - 信号R ASP.NET

    javascript - 当用户离开页面时如何通知服务器?

    azure-active-directory - 设置什么范围和/或资源以获取适用于 office 365 api 的 token ?

    c# - Microsoft Graph API - 如何在没有授权码的情况下获取访问 token ?

    sql-server - 将 SQL Server 数据库迁移到 Azure 时出错

    asp.net-mvc - Aspnet Core Azure 失败并出现 HTTP 错误 502.5 - 进程失败

    azure - 无法将 localhost 用于 Azure 混合连接的终结点主机