当从根、“/”提供服务时,Swagger 不会在 Azure 中授权,尽管从路径、“/swagger”、“/boink”等工作

问题描述 投票:0回答:1

我使用 Swagger 进行了工作设置(大致设置如此答案中所示),将我发送到我授权的 Azure,然后获取功能令牌。一切都按预期进行,这不是从 Web 更改为 SPA

一位同事建议我们应该直接在后端的根目录中提供 Swaggy,而不是路径 /swagger,因此我在代码中进行了以下更改(并在 Azure 中添加了一个额外的重定向 URL(

//app.UseSwagger(options => options.RouteTemplate = "swagger/{documentName}/docs.json");
app.UseSwagger(options => options.RouteTemplate = "swaggy/{documentName}/docs.json");
app.UseSwaggerUI(options =>
{
  ...
  //options.RoutePrefix = "swagger";
  options.RoutePrefix = "swaggy";
});

https://localhost:7001/swagger/oauth2-redirect.html
https://localhost:7001/swaggy/oauth2-redirect.html

这仍然有效,我认为改变招摇位置没有问题。然而,一旦我完全放弃它并从根开始提供它(按照团队的协议)并进行如下所示的更改,它就会停止工作!

//app.UseSwagger(options => options.RouteTemplate = "swagger/{documentName}/docs.json");
app.UseSwagger(options => options.RouteTemplate = "{documentName}/docs.json");
app.UseSwaggerUI(options =>
{
  ...
  //options.RoutePrefix = "swagger";
  options.RoutePrefix = "";
});

https://localhost:7001/swagger/oauth2-redirect.html
https://localhost:7001/oauth2-redirect.html

我突然面临以下错误消息。

Auth ErrorError:响应状态为 400,错误:invalid_request,描述:AADSTS9002326:仅允许“单页应用程序”客户端类型进行跨源令牌兑换。请求来源:'https://localhost:7001'。

我一整天都在谷歌上搜索它,但什么也没看到。所有点击都是指将平台从 Azure 更改为 SPA 和/或检查重定向 URL。这些都与这里无关。

它是什么?我怎样才能杀死它?

azure swagger authorization asp.net-core-8
1个回答
0
投票

Harshitalink 的关键要点是 Swagger UI 选项中

RoutePrefix
设置的灵活性,它允许您根据环境(本地与 Azure)定制 Swagger 的可访问性。请参阅“自定义 HTTP 端点”。

因此,您应该调整 ASP.NET Core 应用程序中的 Swagger 和 Swagger UI 配置,以根据应用程序是在本地运行还是在 Azure 中运行来动态设置

RoutePrefix
。这将确保 Swagger UI 在两种环境中都能正常工作,而无需为每个部署进行手动调整。

// Determine the running environment
var isAzure = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Production";

// Configure Swagger
app.UseSwagger(options => options.RouteTemplate = "swagger/v1/swagger.json");

// Configure Swagger UI
app.UseSwaggerUI(x =>
{
    x.SwaggerEndpoint("/swagger/v1/swagger.json", "Web API V1");

    // Set the RoutePrefix based on the environment
    x.RoutePrefix = isAzure ? "" : "swagger";
});

该代码片段使用

ASPNETCORE_ENVIRONMENT
变量(您可以在此处设置)检查环境,这是区分 ASP.NET Core 应用程序中的开发和生产环境的常用方法。它假设
Production
值表示在 Azure 上部署。

  • 在本地运行时(不在
    Production
    中),
    RoutePrefix
    设置为
    "swagger"
    ,从而可以通过
    /swagger/index.html
    访问 Swagger UI。
  • 部署到 Azure (
    Production
    ) 时,
    RoutePrefix
    设置为空字符串,使 Swagger UI 可以直接在根目录访问 (
    /index.html
    )。

这还应该解决使 Swagger 在所需路径上可访问的问题,而不会导致与 Azure AD 的 OAuth2 流相关的跨源令牌兑换问题 (

AADSTS9002326
),这来自 Azure AD 对 OAuth2 重定向的处理,特别是在场景中重定向似乎来自与预期不同的来源。

在 Azure 上从根 (

/
) 提供 Swagger 服务时,用于 OAuth2 身份验证的重定向 URI 会发生变化,从而影响 Azure AD 处理这些请求的方式。如果 Azure AD 将这些请求视为来自未经授权的来源的跨源请求,它将根据旨在防止未经授权的令牌兑换的安全策略来阻止这些请求。

通过根据部署环境(本地开发与 Azure)动态设置

RoutePrefix
,您可以确保 OAuth2 重定向 URI 与 Azure AD 的期望保持一致,无论应用程序是在本地访问还是在 Azure 上托管。

  • 本地开发:通过

    /swagger/index.html
    访问Swagger UI,OAuth2重定向与本地开发设置一致的使用路径。由于本地不存在跨域问题,因此身份验证流程按预期工作。

  • Azure 部署:将

    RoutePrefix
    设置为空字符串时,Swagger UI 从根 (
    /index.html
    ) 提供服务,并且 OAuth2 重定向预计源自根。该设置将与 Azure 的 OAuth2 重定向安全策略相匹配,从而避免跨源问题,因为重定向似乎不再来自不同的源。

© www.soinside.com 2019 - 2024. All rights reserved.