如何将ASP.Net 5(核心)Authorize属性重定向到401



问题

嗨。我正在开发ASP.Net5(核心而非MVC5(web API。我使用的是带有外部OpenIDConnect身份提供程序的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;
};
});

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

关于如何解决这个问题有什么想法吗?如有任何帮助,我们将不胜感激!

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

还是这是API和客户端应用程序的结合?

最新更新