【问题标题】:How to redirect ASP.Net 5 (Core) Authorize attribute to 401如何将 ASP.Net 5(核心)授权属性重定向到 401
【发布时间】:2021-08-22 13:27:00
【问题描述】:

问题

嗨。我正在开发一个 ASP.Net 5(核心不是 MVC5)Web API。我正在使用带有外部 OpenID Connect 身份提供程序的 cookie 身份验证方案。我正在使用Authorize 属性来确保仅对经过身份验证的用户执行的操作。由于这是一个 Web API,我希望服务器在尝试访问此类操作端点而不经过身份验证时向客户端返回 401。但是,我总是被重定向到我的 OpenID Connect 提供商的登录页面。

设置


以下是相关的服务配置:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
  services.AddControllersWithViews(...);

  services
  .AddAuthentication(options =>
  {
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultSignOutScheme = CookieAuthenticationDefaults.AuthenticationScheme;

    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
  })
  .AddCookie(...)
  .AddOpenIdConnect(...)
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  app.UseRouting();
  app.UseAuthentication();
  app.UseAuthorization();
  app.UseEndpoints(endpoints => endpoints.MapDefaultControllerRoute());
}

我的端点基本上如下所示:

FooController.cs

[ApiController]
[Route("api/[controller]")]
public class FooController : ControllerBase
{
  [Authorize]
  [HttpGet]
  public ActionResult<int> GetBar()
  {
    return Ok(1);
  }
}

尝试


我已尝试按照其他问题的解决方案提出建议,例如以下问题: https://stackoverflow.com/a/47987035/11800986。我在添加 cookie 身份验证时设置了这些重定向事件。

Startup.cs

.AddCookie(options =>
{
  options.Events.OnRedirectToLogin = context =>
  {
    context.Response.Clear();
    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    return Task.CompletedTask;
  };
  options.Events.OnRedirectToAccessDenied = context =>
  {
    context.Response.Clear();
    context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
  };
})

当我在调试模式下运行服务器并在这些重定向处理程序中设置断点时,它们甚至都不会触发。这应该是因为我使用 OpenId Connect 作为默认质询方案,而不是 cookie。

为了尝试解决这个问题,我以类似的方式附加到 OpenId Connect 事件:

Startup.cs

.AddOpenIdConnect(options =>
{
  options.Events.OnRedirectToIdentityProvider = context =>
  {
    context.Response.Clear();
    context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
    return Task.CompletedTask;
  };
});

当我用断点调试它时,这个事件确实会被命中,但它似乎根本没有停止重定向。

关于如何解决这个问题的任何想法?任何帮助将不胜感激!

【问题讨论】:

    标签: asp.net authentication redirect openid-connect


    【解决方案1】:

    纯 API 不应使用 AddCookie 或 AddOpenIDConnect,而应仅使用 AddJwtBearer 身份验证处理程序来接收访问令牌并将其转换为 ClaimsPrincipal 用户对象。

    或者这是一个组合的 API 和客户端应用程序?

    【讨论】:

    • 如果合并,有什么解决办法?我有一个合并的应用程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多