Blazor8 Web 应用程序 - 从 [授权] API 端点抛出 403

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

我有一个 blazor 8 Web 应用程序(“新”样式)。我还想在那里托管一些 API 端点,因此提供了一个示例最小 API:

public static class SampleApi
{
    public static void MapSampleApi(this WebApplication app)
    {
        var apiGroup = app.MapGroup("api");
        
        apiGroup.MapGet("hello", HelloWorld);
        apiGroup.MapGet("auth", Auth);
    }

    public static async Task<IResult> HelloWorld()
    {
        return Results.Text("Hello World", "text/plain");
    }

    [Authorize]
    public static async Task<IResult> Auth()
    {
        return Results.Ok("Authenticated!");
    }
}

它有效...但是当在未经过身份验证的情况下访问

Auth
时,它不会返回 403,而是返回登录页面的 html 响应。

我已经尝试了我能想到的一切,但似乎没有什么可以阻止这种行为。我认为

<Router>
是要查找的位置,并且当 Uri 不包含
<RedirectToLogin />
时,我只提供
/api
组件...但这不起作用。我什至完全注释掉了该组件,Blazor 应用程序和点击 postman 中的 API 端点都重定向到登录页面。我在服务器或客户端应用程序中看不到program.cs中任何明显的东西。

我将如何使用 blazor 应用程序维护重定向,但是当它是 API 端点(所有 API 端点都将在

/api/
之后)时,请继续并返回 403。

authentication routes blazor
1个回答
0
投票

路由器组件与此问题没有任何关系,您的请求到达 api 的端点,而不是剃刀组件

此外,对于您的场景,应该是 401 unauthenticated,而不是 403 unauthorized,您可以查看此文档了解更多详细信息

重定向到登录页面的行为通常是由于 Cookie 身份验证中配置的回调事件引起的(身份也是基于 CookieAuthentication 的),因此请尝试如下配置:

builder.Services.ConfigureApplicationCookie(op => op.Events.OnRedirectToLogin = async (contxext) =>
    {
        if (contxext.HttpContext.Request.Path.Value.Contains("api"))
        {
            contxext.Response.StatusCode = 401;
        }
        else
        {
            var redirectpath = contxext.RedirectUri;
            contxext.HttpContext.Response.Redirect(redirectpath);
        }
    });

当我尝试使用 Blazor 个人帐户模板的最小示例时,它现在运行良好:

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