使用 swagger ui 的 Azure Functions 广告身份验证说未找到 redirect.html

Posted

技术标签:

【中文标题】使用 swagger ui 的 Azure Functions 广告身份验证说未找到 redirect.html【英文标题】:Azure Functions Ad authentication using swagger ui says redirect.html is not found 【发布时间】:2021-12-15 02:48:48 【问题描述】:

我正在使用 Azure 函数 V3 这是我的启动.cs 公共覆盖无效配置(IFunctionsHostBuilder 构建器) var configuration = builder.GetContext().Configuration;

        builder.AddSwashBuckle(Assembly.GetExecutingAssembly(), opts =>
        
            opts.SpecVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
            opts.Title = "My test app";
            
            opts.ConfigureSwaggerGen = x =>
            
                //custom operation example
                x.CustomOperationIds(apiDesc => apiDesc.TryGetMethodInfo(out MethodInfo methodInfo)
                ? methodInfo.Name
                : new Guid().ToString());

                //custom filter example
                //x.DocumentFilter<RemoveSchemasFilter>();
                //oauth2
                x.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme
                
                    Type = SecuritySchemeType.OAuth2,
                    Flows = new OpenApiOAuthFlows
                    
                        Implicit = new OpenApiOAuthFlow
                        
                            AuthorizationUrl = new Uri(string.Format("https://login.microsoftonline.com/0/oauth2/v2.0/authorize", configuration["AzureAd:TenantId"])),
                            Scopes = new Dictionary<string, string>
                            
                                 configuration["AzureAd:scope"], "scope" 
                            
                        ,
                        AuthorizationCode = new OpenApiOAuthFlow
                        
                            AuthorizationUrl = new Uri(string.Format("https://login.microsoftonline.com/0/oauth2/v2.0/authorize", configuration["AzureAd:TenantId"])),
                            TokenUrl = new Uri(string.Format("https://login.microsoftonline.com/0/oauth2/v2.0/token", configuration["AzureAd:TenantId"])),
                            Scopes = new Dictionary<string, string>
                            
                                 configuration["AzureAd:scope"], "scope" 
                            

                        
                    
                );
                x.AddSecurityRequirement(new OpenApiSecurityRequirement
                
                     
                     new OpenApiSecurityScheme
                        
                        Reference = new OpenApiReference
                        
                        Type = ReferenceType.SecurityScheme,
                        Id = "oauth2"
                        ,
                                Scheme = "oauth2",
                                Name = "oauth2",
                                In = ParameterLocation.Header
                     ,
                        new List<string>()
                     
                );
                
            ;
            opts.ClientId = configuration["AzureAd:ClientId"];
            
            opts.OAuth2RedirectPath = "http://localhost:7071/api/swagger/ui/o2c-html";
            //configuration["AzureAd:redirectURI"];
            
        );
        
        builder.Services.AddLogging();

       
    

swagger Ui 生成。但是,当我单击授权时,它会重定向到 redirect.html 并说未找到。 This localhost page can't be found 没有找到该网址的网页:http://localhost:7071/api/swagger/ui/o2c-html#

【问题讨论】:

我认为您需要在门户网站和应用程序中提供以 /swagger/oauth2-redirect.html 结尾的重定向网址。您尝试过吗? 您在 Azure 函数中使用哪个包进行 Swagger 配置?如果您使用的是this 包,那么我相信您应该使用this 线程中讨论的一些解决方法。 @kavyasaraboju-MT 是在门户网站和应用程序中提供了重定向 url。没有帮助 你最后改成/oauth2-redirect.html了吗(请检查你是否在这两个地方都有https协议)。如果完成,您是否通过授予管理员同意公开了范围并为添加的范围添加了权限。还要检查重定向 uri 的类型。您能否检查这些并提供有关相同的屏幕截图/代码详细信息 @user1672994 感谢分享。这解决了问题 【参考方案1】:

感谢 @useruser1672994 对此提供见解。添加这个解决了问题

/// <summary>
    /// This is only needed for OAuth2 client. This redirecting document is normally served
    /// as a static content. Functions don't provide this out of the box, so we serve it here.
    /// Don't forget to set OAuth2RedirectPath configuration option to reflect this route.
    /// </summary>
    /// <param name="req"></param>
    /// <param name="swashBuckleClient"></param>
    /// <returns></returns>
    [SwaggerIgnore]
    [FunctionName("SwaggerOAuth2Redirect")]
    public static Task<HttpResponseMessage> SwaggerOAuth2Redirect(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "swagger/oauth2-redirect")]
        HttpRequestMessage req,
        [SwashBuckleClient] ISwashBuckleClient swashBuckleClient)
    
        return Task.FromResult(swashBuckleClient.CreateSwaggerOAuth2RedirectResponse(req));
    

【讨论】:

以上是关于使用 swagger ui 的 Azure Functions 广告身份验证说未找到 redirect.html的主要内容,如果未能解决你的问题,请参考以下文章

在 Azure 的 ASP.NET Core 3.1 应用程序中获取 swagger-ui 返回 404

Swagger UI 未在 azure .net 核心中生成,但在本地工作

ASP.NET Core 3.1 Web API(版本控制)和 Swagger UI 在发布到 Azure 后由于 MvcJsonOptions 而失败

当试图打开Swagger-UI时只获得一个json Response

从 go-swagger UI 访问 API 时 Golang 中的 CORS 问题

Swagger 连接到 Azure ..现在呢?