如何启用自定义授权消息
How to enable custom authorization messages
免责声明:该主题的结果通常很旧,不一定涉及使用 Identity Core 的 Asp.Net Core 3.1。我正在尝试寻找现代推荐的解决方案。
我已经使用 Identity 和 JWT 创建了概念验证 Web API 应用程序。这个想法是导航到该网站并能够登录并查看您的索赔、更改您的密码和身份附带的其他功能。
另一个组件是将 Web API 仅与 JWT 一起使用。
我已经实施 claims/policies 并且授权效果很好。总的来说,我对这个概念证明很满意。
有一件事尤其有待改进:当用户未通过身份验证或通过 JWT 使用 API 时未经过身份验证但未获得授权时的消息。目前它所做的只是 return 403(已验证但未授权)或 401(未验证)响应代码,没有相关消息。
举个例子。我有一个声明,ClaimType: Api, ClaimValue: Delete
映射到一个策略(字符串常量以避免魔术字符串):CanDeletePolicy
options.AddPolicy(Policies.CanDeletePolicy, policy => {
policy.RequireClaim("Api", "Delete");
});
请记住,一切都在按预期进行。我只是想为 API 的消费者提供有意义的信息。
控制者:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class PeopleController : ControllerBase {
private readonly ILogger<PeopleController> _logger;
private readonly IPeopleService _peopleService;
public PeopleController(ILogger<PeopleController> logger, IPeopleService peopleService) {
_logger = logger;
_peopleService = peopleService;
}
...
PeopleController 中的操作:
[HttpDelete("[action]/{id:int}")]
[Authorize(Policy = Policies.CanDeletePolicy)]
public IActionResult Delete(int id) {
var result = _peopleService.Delete(id);
var username = User.FindFirstValue(ClaimTypes.Name);
if (result < 1) {
var message = $"User '{username}' was unable to delete a person with Id {id}";
_logger.LogError(message);
return BadRequest(new {
Message = message
});
}
var successMessage = $"User '{username}' successfully deleted the person with Id {id}";
_logger.LogDebug(successMessage);
return Ok(new {
Message = "Person deleted"
});
}
如果用户尝试使用此操作:
- 但未通过身份验证,他们收到空的 401 响应
- 已通过身份验证,但未获得授权,他们收到空的 403 响应
我愿意提供不同程度的信息:
401 与响应正文 "You are not authenticated"
403 响应正文 "You are not authorized" 或 "You are not authorized: Api, Update required"
我有哪些选择?创建自定义授权属性?我宁愿不重新发明轮子只是为了添加一个简单的信息。我也希望以 JSON 格式进行授权响应,但我认为这对于提议的解决方案并不重要。
public class ResponseFormatterMiddleware
{
private readonly RequestDelegate _next;
public ResponseFormatterMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next.Invoke(context);
if (context.Response.StatusCode == StatusCodes.Status401Unauthorized)
{
await context.Response.WriteAsync(
JsonConvert.SerializeObject(new ResponseModel("some-message")));
}
}
}
public class ResponseModel
{
public ResponseModel(string message)
{
this.Message = message;
}
public string Message { get; set; }
}
并且在启动时:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// put middleware before authentication
app.UseMiddleware<ResponseFormatterMiddleware>();
app.UseAuthentication();
}
免责声明:该主题的结果通常很旧,不一定涉及使用 Identity Core 的 Asp.Net Core 3.1。我正在尝试寻找现代推荐的解决方案。
我已经使用 Identity 和 JWT 创建了概念验证 Web API 应用程序。这个想法是导航到该网站并能够登录并查看您的索赔、更改您的密码和身份附带的其他功能。
另一个组件是将 Web API 仅与 JWT 一起使用。
我已经实施 claims/policies 并且授权效果很好。总的来说,我对这个概念证明很满意。
有一件事尤其有待改进:当用户未通过身份验证或通过 JWT 使用 API 时未经过身份验证但未获得授权时的消息。目前它所做的只是 return 403(已验证但未授权)或 401(未验证)响应代码,没有相关消息。
举个例子。我有一个声明,ClaimType: Api, ClaimValue: Delete
映射到一个策略(字符串常量以避免魔术字符串):CanDeletePolicy
options.AddPolicy(Policies.CanDeletePolicy, policy => {
policy.RequireClaim("Api", "Delete");
});
请记住,一切都在按预期进行。我只是想为 API 的消费者提供有意义的信息。
控制者:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class PeopleController : ControllerBase {
private readonly ILogger<PeopleController> _logger;
private readonly IPeopleService _peopleService;
public PeopleController(ILogger<PeopleController> logger, IPeopleService peopleService) {
_logger = logger;
_peopleService = peopleService;
}
...
PeopleController 中的操作:
[HttpDelete("[action]/{id:int}")]
[Authorize(Policy = Policies.CanDeletePolicy)]
public IActionResult Delete(int id) {
var result = _peopleService.Delete(id);
var username = User.FindFirstValue(ClaimTypes.Name);
if (result < 1) {
var message = $"User '{username}' was unable to delete a person with Id {id}";
_logger.LogError(message);
return BadRequest(new {
Message = message
});
}
var successMessage = $"User '{username}' successfully deleted the person with Id {id}";
_logger.LogDebug(successMessage);
return Ok(new {
Message = "Person deleted"
});
}
如果用户尝试使用此操作:
- 但未通过身份验证,他们收到空的 401 响应
- 已通过身份验证,但未获得授权,他们收到空的 403 响应
我愿意提供不同程度的信息:
401 与响应正文 "You are not authenticated"
403 响应正文 "You are not authorized" 或 "You are not authorized: Api, Update required"
我有哪些选择?创建自定义授权属性?我宁愿不重新发明轮子只是为了添加一个简单的信息。我也希望以 JSON 格式进行授权响应,但我认为这对于提议的解决方案并不重要。
public class ResponseFormatterMiddleware
{
private readonly RequestDelegate _next;
public ResponseFormatterMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
await _next.Invoke(context);
if (context.Response.StatusCode == StatusCodes.Status401Unauthorized)
{
await context.Response.WriteAsync(
JsonConvert.SerializeObject(new ResponseModel("some-message")));
}
}
}
public class ResponseModel
{
public ResponseModel(string message)
{
this.Message = message;
}
public string Message { get; set; }
}
并且在启动时:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// put middleware before authentication
app.UseMiddleware<ResponseFormatterMiddleware>();
app.UseAuthentication();
}