我有一个 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。
路由器组件与此问题没有任何关系,您的请求到达 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);
}
});