asp.net - 如何将 ASP.Net 5(核心)授权属性重定向到 401
问题描述
问题
你好。我正在开发一个 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;
};
});
当我用断点调试它时,这个事件确实会受到影响,但它似乎根本没有停止重定向。
有想法该怎么解决这个吗?任何帮助将不胜感激!
解决方案
纯 API 不应使用 AddCookie 或 AddOpenIDConnect,而应仅使用 AddJwtBearer 身份验证处理程序来接收访问令牌并将其转换为 ClaimsPrincipal 用户对象。
或者这是一个组合的 API 和客户端应用程序?
推荐阅读
- facebook - 如何为服务器到服务器应用成功提交 Facebook 应用评论?
- mongoose - 无法在 NestJS 应用程序中启动并运行猫鼬虚拟填充
- javascript - 一键自动拖放
- javascript - 如何在 Firebase 更新中获取正确的文件路径
- javascript - 用户单击 Chrome 扩展中的页面链接后如何检测 URL 是否更改?
- python - 修改后OpenCv不会保存图像
- javascript - RxDb - 从具有特定索引的数组中删除对象
- python - 无法打印全局变量
- node.js - 使用 mongoose 更新 mongodb 中的多条记录
- flutter - Flutter 应用程序中的子小部件问题