.net 来自IAuthorizationRequirement上下文失败的响应中的自定义消息
我有一个定制要求:.net 来自IAuthorizationRequirement上下文失败的响应中的自定义消息,.net,authentication,asp.net-core-2.1,.net,Authentication,Asp.net Core 2.1,我有一个定制要求: public sealed class MyRequirement : IAuthorizationRequirement { } 我在我的申请中注册的: .AddAuthorization(options => options.AddPolicy(Policy.MyPolicy, policy => { policy.AddRequirements(new MyRequirement()); })) 处理程序有几个检查: public sealed
public sealed class MyRequirement : IAuthorizationRequirement
{
}
我在我的申请中注册的:
.AddAuthorization(options =>
options.AddPolicy(Policy.MyPolicy, policy => { policy.AddRequirements(new MyRequirement()); }))
处理程序有几个检查:
public sealed class MyHandler : AuthorizationHandler<MyRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
{
if (!context.User.HasClaim(c => c.Type == CustomClaimTypes.Status))
{
//_logger.Warning($"Status missing");
context.Fail();
}
else
{
var rawStatus = context.User.Claims.Single(x => x.Type == CustomClaimTypes.Status).Value;
EnumExtensions.TryParseNullable<Status>(rawStatus, true, out var status);
switch (status)
{
case null:
//_logger.Warning($"Authentication forbidden: Unexpected status: {rawStatus}");
context.Fail();
break;
case Status.A:
case Status.B:
//_logger.Warning($"Authentication forbidden: Invalid status: {status}");
context.Fail();
break;
case Status.C:
context.Succeed(requirement);
break;
}
}
return Task.CompletedTask;
}
}
公共密封类MyHandler:AuthorizationHandler
{
受保护的覆盖任务HandleRequirementAsync(授权HandlerContext上下文,MyRequirement)
{
if(!context.User.HasClaim(c=>c.Type==CustomClaimTypes.Status))
{
//_记录器。警告($“状态缺失”);
context.Fail();
}
其他的
{
var rawStatus=context.User.Claims.Single(x=>x.Type==CustomClaimTypes.Status).Value;
EnumExtensions.tryparsullable(rawStatus、true、out var状态);
开关(状态)
{
大小写为空:
//_警告($“禁止身份验证:意外状态:{rawStatus}”);
context.Fail();
打破
案件状况。A:
案件状况B:
//_警告($“禁止身份验证:无效状态:{status}”);
context.Fail();
打破
案件状况C:
成功(要求);
打破
}
}
返回Task.CompletedTask;
}
}
如果上下文失败,但我想向响应中添加一条自定义消息,如记录器中的文本,则会成功返回403
我一直在谷歌上搜索这个,它看起来几乎不可能,我不明白,因为它感觉像是非常基本的功能
有没有关于如何在回复中添加自定义文本的想法?对延迟回复表示歉意 我用这个解决了这个问题:
switch (status)
{
case Status.A:
{
context.Succeed(requirement);
break;
}
default:
{
await SetForbiddenResultAsync(context.Resource);
context.Fail();
break;
}
}
在哪里
如果禁止EntityResult只是一个结果类型,则可以将其替换为任何ObjectResult
在这里,您还可以进行日志记录,或处理其他结果,如未经授权等解决了它!奇怪的是,堆栈溢出中以前没有人遇到过这个问题。我觉得很平常你是怎么解决的?这似乎不是一个标准的方法。@Nick你是怎么解决这个问题的?你能分享一下细节吗
private async Task SetForbiddenResultAsync(object resource)
{
var forbiddenResult = new ForbiddenEntityResult(new Error(resource.name));
mvcContext.Result = forbiddenResult;
await mvcContext.Result.ExecuteResultAsync(mvcContext);
}