【问题标题】:Custom message in Response from IAuthorizationRequirement context failure来自 IAuthorizationRequirement 上下文失败的响应中的自定义消息
【发布时间】:2019-08-03 04:00:05
【问题描述】:

我有一个自定义要求:

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

如果上下文失败,这将成功返回 403,但我想在响应中添加自定义消息,例如记录器中的文本。

我一直在谷歌上搜索它,它看起来几乎不可能,我不明白,因为它感觉像是非常基本的功能。

任何想法如何将自定义文本添加到响应中?

【问题讨论】:

  • 解决了!奇怪的是 Stack-overflow 之前没有人遇到过这个问题。对我来说似乎很常见
  • 你是怎么解决的?这似乎不是一种标准的方法。
  • @Nick 你是怎么解决这个问题的?能否请您分享详细信息

标签: .net authentication asp.net-core-2.1


【解决方案1】:

对于延迟回复表示歉意。

我用这个解决了这个问题:

             switch (status)
            {
                case Status.A:
                {
                    context.Succeed(requirement);
                    break;
                }
                default:
                {
                    await SetForbiddenResultAsync(context.Resource);
                    context.Fail();
                    break;
                }
            }

在哪里

    private async Task SetForbiddenResultAsync(object resource)
    {
         var forbiddenResult = new ForbiddenEntityResult(new Error(resource.name));
         mvcContext.Result = forbiddenResult;
         await mvcContext.Result.ExecuteResultAsync(mvcContext);
    }

ForbiddenEntityResult 只是一个结果类型,你可以用任何 ObjectResult 替换它。

在这里你也可以做日志记录,或者处理其他的结果,比如未授权等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2022-10-24
    • 2021-05-19
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多