我使用 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。这些都与这里无关。
它是什么?我怎样才能杀死它?
Harshita 的 link 的关键要点是 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。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 重定向安全策略相匹配,从而避免跨源问题,因为重定向似乎不再来自不同的源。