在需要身份验证才能访问的场景中使用 Azure CDN 的最佳做法?

问题描述

我之前从未配置过 CDN,我正在寻找有关如何为我的场景进行配置的指导。

就上下文而言,我目前正在使用 Azure Verizon Premium CDN 和 Azure 应用服务 (.Net Core)。我的身份验证平台是 Azure Active Directory。

我有一个静态 Web 应用程序,其中包含大量静态内容(数百个文件)。用户在 (www.mysite.azurewebsites.net/index.html) 处点击了网站。 Index.html 然后获取大量静态内容(各种、图像、视频、元数据)。最初,要求只是公开提供内容,但现在我要求根据用户是否具有特定角色以及用户是否访问特定路径来限制对某些内容的访问。我还需要能够将一些内容公开并让最终用户高度可用。

在授权要求出现之前,我能够成功设置 CDN 端点 (www.mysite-cdn.azureedge.net) 并将其指向我的应用服务没问题!我可以访问该站点并从 cdn 端点查看站点内容,而无需身份验证。

当我向站点添加身份验证时出现问题,我的 CDN 在身份验证流程中被重定向回原始端点。源身份验证中间件 (Nuget: Microsoft.Identity.Web) 自动将 AAD 的回调 uri 组装为“www.mysite.azurewebsites.net/signin-oidc”。因此,用户点击 CDN 端点的当前流程会将他们返回到应用服务端点上的错误页面。虽然如果他们手动重定向到“www.mysite.azurewebsites.net”,他们已登录,但我不想将用户重定向回原点,我想让他们保持在 www.mysite-cdn.azurewebsites.net

基本上,我希望能够启用这些流: 公共最终用户 -> CDN 端点 + 公共路径 ->(CDN 请求源和缓存)-> 最终用户在 CDN 端点看到站点 内部最终用户 -> CDN 端点 + 私有路径 ->(CDN 请求来源并具有访问权限)-> 用户被允许进入 CDN 端点的站点 内部最终用户 -> CDN 端点 + 私有路径 ->(CDN 请求来源且没有访问权限)-> 用户重定向到公共 CDN 端点(或未经授权的页面

这是对 OnPrepareResponse 中每个静态文件静态文件选项的身份验证检查。这会在请求服务器上此文件夹中的静态资产之前检查身份验证。这在没有 CDN 的情况下工作正常。应该注意的是,我也进行了角色检查,为了示例起见,这已被简化,因为它带有身份验证。

OnPrepareResponse = staticContext =>
                {
                    // require authentication
                    if (authenticate && 
                        !staticContext.Context.User.Identity.IsAuthenticated)
                    {
                        // Redirect back to index sign in page all unauthorized requests
                        staticContext.Context.Response.Redirect(unauthenticatedRedirectPath);
                    }
                },

我确实发现这个堆栈溢出似乎与我的问题相似,但是我使用的是不同的 NuGet 包 (Microsoft.Identity.Web)。我实施了重定向检查,但是这似乎不起作用,并在尝试登录时导致无限循环。

Action<MicrosoftIdentityOptions> _configureMsOptions = (options) =>
            {
                options.Instance = Configuration["AzureAd:Instance"];
                options.Domain = Configuration["AzureAd:Domain"];
                options.ClientId = Configuration["AzureAd:ClientId"];
                options.TenantId = Configuration["AzureAd:TenantId"];
                options.CallbackPath = Configuration["AzureAd:CallbackPath"];
                options.Events.OnRedirectToIdentityProvider = async (context) =>
                {
            // This check doesn’t work because the request host always is mysite.azurewebsites.net in this context
                   //  if (context.Request.Host.Value.Contains("mysite-cdn")) 
                   // {
                        context.ProtocolMessage.RedirectUri = "https://" + "mysite-cdn-dev.azureedge.net/" + Configuration["AzureAd:CallbackPath"];
                    //}
                };
            };

我已开始研究 Azure Front door,因为这似乎更适用于我的用例,但尚未进行设置。它提供了一定程度的缓存/POP 以及安全性。看起来也可以通过一些 Web 服务器调整与 Azure AD 一起使用。如果 Azure Front Door 听起来是比 Azure CDN 更明智的 CDN 解决方案,那么从其他人那里知道会很好。

我还研究了 Azure CDN 令牌身份验证 - 但这似乎也要求我使用身份验证令牌标记每个请求。它改变了我的架构,这样我就不能再仅仅将我的 CDN 指向网络应用程序,而是我的应用程序会给浏览器一个令牌,以便它可以安全地请求每个资产。

综上所述,我正在寻找有关如何在使用 CDN 的同时最好地配置应用程序同时使用身份验证的指导。谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)