【问题标题】:How can I return 403 Forbidden instead redirect in Blazor Web Assembly app?如何在 Blazor Web Assembly 应用程序中返回 403 Forbidden 而不是重定向?
【发布时间】:2020-11-21 07:08:31
【问题描述】:

我们有一个与 ASP.NET Core API-Controller (V3.1) 配合使用的 Blazor WebAssembly-App。 Authentication Cookie 与我们的 Api-Controller 中的[Authorize] 属性配合得很好:

namespace BlazorWebAssemblyApp.Server.Controllers
{
    [Route("[controller]")]
    [ApiController]
    public class ClientsController : ControllerBase
    {          
        private const string AuthSchemes = CookieAuthenticationDefaults.AuthenticationScheme;

        [HttpGet("search")]
        [Authorize(AuthenticationSchemes = AuthSchemes)]
        public ActionResult<List<Shared.Client>> Search(Shared.Client.SearchProperty pProperty, string pText)
        {
            // [...]
        }
    }
}

我们正在使用here 描述的解决方案来返回 HTTP 状态代码 403 Forbidden,而不是路由到登录页面。

namespace BlazorWebAssemblyApp.Server
{
    public class Startup
    {
        // [...]

        public void ConfigureServices(IServiceCollection services)
        {
            // [...]
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => {
                options.Events.OnRedirectToAccessDenied = context => {
                    context.Response.StatusCode = 403;
                    return Task.CompletedTask;
                };
            });
        }
    }
}

但解决方案不起作用。应用仍然重定向到默认路径/Account/Login:

如何在 Blazor Web Assembly 应用程序中返回 http 状态代码 403 Forbidden 而不是重定向?

【问题讨论】:

  • “返回 403”究竟是什么意思,您希望用户看到什么?
  • @HenkHolterman:当我得到一个 http-status 代码 403 时,我可以通过一个合适的错误消息来处理它并将用户重定向到登录页面。
  • 有没有机会看看你的 blazor web 客户端如何处理 cookie,我对 cookie 比 JWT 障碍更有趣,但我不知道如何在我的 webassambly http 客户端中保存 cookie跨度>

标签: asp.net asp.net-core asp.net-web-api blazor blazor-webassembly


【解决方案1】:

只需添加OnRedirectToLogin

options.Events.OnRedirectToLogin = context =>
{
    context.Response.StatusCode = 401; // or 403 if you want
    return Task.CompletedTask;
};

【讨论】:

  • 我已经添加了这个代码块。请查看我的问题。
  • @Simon,你添加了OnRedirectToAccessDenied。只需在下方添加OnRedirectToLogin
  • @Simon,我有一个 AspNet.Core Blazor WebAssembly 项目,使用 401 处理未经身份验证的请求,使用 403 处理未经授权的请求
【解决方案2】:

请使用 JWT 不记名身份验证方案,而不是使用 cookie 身份验证方案,cookie 身份验证方案将始终将用户重定向到默认登录页面。 请修改您的代码如下:-

 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Authority = "";
                options.Audience = "";
            });

请通过适当的权威受众。使用上面的代码,服务器现在已配置为通过检查访问令牌来验证和授权请求,如果未提供令牌或传递了不正确的令牌,现在将返回 401 未授权。

【讨论】:

  • 在 api 级别请不要使用任何身份验证方案装饰授权属性,它应该从配置的服务中获取身份验证方案。
  • “cookie 身份验证方案将始终将用户重定向到默认登录页面”这是不正确的,请参阅下面的答案
  • @3per- 同意的兄弟..我很抱歉.. 我的意思是身份验证方案应该是 JWT 承载而不是 cookie 身份验证,因为要求是如果未通过身份验证的 api 调用应该以 401 失败代替被重定向到登录页面。
  • @simon-如果您可以阐明是否使用访问令牌保护您的 api 或者如果要求是如果用户未通过身份验证则请求将非常有用应该以 401 失败吗?
猜你喜欢
  • 2017-06-02
  • 2019-06-15
  • 1970-01-01
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多