如何在 Swagger UI 中定向到 AspNet.Security.OAuth.Providers 登录页面

How to direct to AspNet.Security.OAuth.Providers login pages within Swagger UI

我目前有一个控制器可以将用户重定向到登录页面。如果可能的话,我想知道如果您改用 swagger UI 到 运行 控制器,是否会发生这种重定向。控制器的代码如下,它使用社区 AspNet.Security.OAuth.Providers 插件,特别是 Discord 提供程序。希望这会加快开发时间,因为我们将能够从 Swagger UI 中访问所有内容,而无需手动输入地址。

Program.cs

中添加身份验证
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie("Cookies", options =>
            {
                options.LoginPath = "/api/v1/login";
                options.LogoutPath = "/api/v1/logout";
                options.ExpireTimeSpan = new TimeSpan(7, 0, 0, 0);
                options.Cookie.MaxAge = new TimeSpan(7, 0, 0, 0);
                options.Cookie.Name = "access_token";
                options.Cookie.HttpOnly = false;
                options.Events.OnRedirectToLogin = context =>
                {
                    context.Response.Headers["Location"] = context.RedirectUri;
                    context.Response.StatusCode = 401;
                    return Task.CompletedTask;
                };
            })
            .AddDiscord(options =>
            {
                options.ClientId = settings.ClientId.ToString();
                options.ClientSecret = settings.ClientSecret;
                options.Scope.Add("guilds");
                options.Scope.Add("identify");
                options.SaveTokens = true;
                options.Prompt = "none";
                options.AccessDeniedPath = "/oauthfailed";
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.CorrelationCookie.SameSite = SameSiteMode.Lax;
                options.CorrelationCookie.HttpOnly = false;
            });

我们如何设置 Swagger

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
        options.RoutePrefix = string.Empty;
    });
}

我们对 AuthenticationController.cs

的 GET 查询
    [HttpGet("login")]
    public IActionResult Login([FromQuery] string ReturnUrl)
    {
        if (string.IsNullOrEmpty(ReturnUrl))
            ReturnUrl = "/guilds";

        var properties = new AuthenticationProperties()
        {
            RedirectUri = ReturnUrl,
            Items =
            {
                { "LoginProvider", "Discord" },
                { "scheme", "Discord" }
            },
            AllowRefresh = true,
        };

        return Challenge(properties, "Discord");
    }

我们目前在 Swagger 中的响应:

而不是像控制器通常那样将您引导至 discord.com 网站。

如果这不可能,或者这不是 Swagger 支持的一部分,那也没关系!它主要是为我们节省时间。

如有任何反馈,我们将不胜感激。

好的,下面是我对 api 网站所做的。首先允许用户手动登录并以您喜欢的方式(如您所愿)对他们进行身份验证。 设置 cookie 身份验证并将 cookie 身份验证添加到您的 api 控制器(就像您所做的那样)。

所以剩下的就是防止未经授权访问您的 swagger 页面 - 因为 swagger 不会 know/care 关于您的 cookie 身份验证。

只需要一个小中间件来检查请求路径并验证用户是否已通过身份验证。 此代码将检查 /swagger 的请求路径,然后检查用户是否已通过身份验证。如果不是,则返回 401。

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;


namespace Middleware.Classes
{
    public static class SwaggerAuthorizeExtensions
    {
        public static IApplicationBuilder UseSwaggerAuthorized(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<SwaggerAuthorizedMiddleware>();
        }
    }
    public class SwaggerAuthorizedMiddleware
    {
        private readonly RequestDelegate _next;

        public SwaggerAuthorizedMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            if (context.Request.Path.StartsWithSegments("/swagger")
                && !context.User.Identity.IsAuthenticated)
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                return;
            }

            await _next.Invoke(context);
        }
    }
}

现在在您的启动代码中调用 IApplicationBuilder.UseSwaggerAuthorized() 扩展函数来启用中间件。然后沉浸在用户的爱和感情中。

app.UseSwaggerAuthorized();