Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 来自IAuthorizationRequirement上下文失败的响应中的自定义消息_.net_Authentication_Asp.net Core 2.1 - Fatal编程技术网

.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);
    }