azure - 如何使 Azure AD 身份验证接受 url 查询字符串访问 token

标签 azure signalr azure-active-directory azure-web-app-service

有没有办法配置内置的 Azure AD 身份验证以接受 Authorization: Bearer <token> header 和 access_token=<token> url 查询字符串?

我需要它来允许来自浏览器的 SingalR WebSocket 连接。

我的场景

我有一个托管 SignalR Core 集线器的 ASP.Net Core 后端。该网站作为启用了 Azure AD 身份验证的 Azure 应用服务托管。

从 .Net 应用程序和网站访问 REST API 都可以正常工作。

来自.Net

SignalR 与 .Net 应用程序的连接工作正常并使用 websocket。 Websocket 连接是通过以下 HTTP 请求建立的:

GET https://<url>/hubs/chat?id=rk-Adzl1EWGCv8wsVF5ayg HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: m02nzEFDAFVwCgUPlF2rEA==
Sec-WebSocket-Version: 13
X-Requested-With: XMLHttpRequest
Authorization: Bearer <token>
Host: evotrqhub.evopro-ag.de
Cookie: ARRAffinity=8666c8fbc8cd126e76e2b31c5880dd9c4968a103221108a610b408e12a15fa39

请注意,授权是通过Authorization: Bearer <token>完成的。 header 。

从浏览器

当我从浏览器(Chrome 或 Firefox)建立 SignalR 连接时,无法建立 Websocket 连接,并且使用长轮询作为后备。 websocket连接的HTTP请求是:

GET https://evotrqhub.evopro-ag.de/hubs/coilthickness?id=QB5xx4MLGi6uSvVK4QmvZA&access_token=<token> HTTP/1.1
Host: evotrqhub.evopro-ag.de
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://localhost:5000
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: de,en-US;q=0.9,en;q=0.8
Cookie: ARRAffinity=8666c8fbc8cd126e76e2b31c5880dd9c4968a103221108a610b408e12a15fa39
Sec-WebSocket-Key: K4hUR2QFyRxcDKxfoNwn2w==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

这里的授权是通过 auth_token=<token> 完成的url查询参数。

来自服务器的响应是重定向(响应代码 302)到 Azure AD 登录页面。

SignalR Core docs建议使用JwtBearerEvents OnMessageReceived来处理这种情况,但在这种情况下,Azure 服务应用程序的 Azure AD 身份验证会在我的用户代码处理该查询之前拒绝该查询。

有没有办法配置 Azure 应用服务 AD 身份验证以接受 access_token参数?

最佳答案

我不知道是否有内置方法可以使用 Microsoft identity platform 来管理此问题(可能是),无论如何,您可以简单地在管道中添加一个中间件来检查请求上下文中是否存在承载 token ,如果不存在,请检查查询字符串集合中是否存在 access_token 参数,然后添加它作为新授权 header 中的不记名 token ,如下面的代码片段所示。

Startup.cs

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {

        ...  
      
        app.UseCors("CorsPolicy");

        // START BEARER TOKEN MIDDLEWARE ---------------------------------------------
        app.Use(async (context, next) =>
        {
            if (
                string.IsNullOrWhiteSpace(context.Request.Headers["Authorization"]) &&
                context.Request.QueryString.HasValue
            )
            {
                var token = context.Request.QueryString.Value
                    .Split('&')
                    .SingleOrDefault(x => x.Contains("access_token"))?.Split('=')[1];
                if (!string.IsNullOrWhiteSpace(token))
                {
                    context.Request.Headers.Add(
                        "Authorization", 
                        new[] { $"Bearer {token}" }
                    );
                }
            }
            await next.Invoke();
        });
        // END BEARER TOKEN MIDDLEWARE -----------------------------------------------

        app.UseAuthentication();
        app.UseAuthorization();

        ...

    }

显然,从安全角度来看,这不是最好的方案,因此请确保您的 api 通过 https 进行传输,并注意加密或完全避免请求日志。

关于azure - 如何使 Azure AD 身份验证接受 url 查询字符串访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55496199/

相关文章:

c# - Azure SendGrid 已暂停

c# - IIS 8.0 中的 SignalR HttpContext.Current null

c# - .net 检查用户是否登录 signalR

.net - Windows Azure Active Directory - 刷新 token 过期

azure - 无法通过 AccessToken 和 ClientCredentialProvider 创建 GraphServiceClient 使用 Graph API(C# 控制台)发送电子邮件

azure - Azure Web 应用程序中的多个应用程序

javascript - 如何检测移动浏览器何时返回到已暂停的页面?

azure - Azure AD 图形客户端中的分页

Azure AD 身份验证回复地址不匹配

azure - 将 B2C 租户用户迁移到其他 B2C 租户