gpt4 book ai didi

c# - ASP.NET Core 中失败的授权要求的错误状态代码

转载 作者:行者123 更新时间:2023-11-30 15:56:49 25 4
gpt4 key购买 nike

我已经通过自动化要求创建了具有简单自动化的 Web API。我的需求代码如下:

public class TestRequirement : IAuthorizationRequirement { }

public class TestHandler : AuthorizationHandler<TestRequirement> {
protected override Task
HandleRequirementAsync(AuthorizationHandlerContext context, TestRequirement requirement) {
//context.Succeed(requirement); --#1
//context.Fail(); --#2
/*if (context.Resource is AuthorizationFilterContext mvcContext) {--#3
mvcContext.Result = new UnauthorizedResult();
}*/
return Task.CompletedTask;
}
}

另外,我更新了 Startup.ConfigureServices(...):

        services.AddAuthorization(o => o.AddPolicy("Test", p => p.Requirements.Add(new TestRequirement())));
services.AddSingleton<IAuthorizationHandler, TestHandler>();

我向 Controller 添加了适当的属性:[Authorize(Policy = "Test")]

如果我取消注释 block #1 - 它按预期工作(我得到我的数据)。但是当我的代码失败时(我评论 #1),我得到 500 Internal Server Error

然后,我尝试显式使要求失败(取消注释 block #2)- 结果相同。我知道不推荐,但我想试试。

在此之后,我尝试了更丑陋的解决方法,我评论了#2 并取消了#3 block 的评论。我得到了相同的 500 状态码。

为了好玩,我实现了具有相同行为的资源过滤器:

public class TestResourceFilterAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context) {
context.Result = new UnauthorizedResult();
}

public void OnResourceExecuted(ResourceExecutedContext context) {
}
}

然后,我在 Controller 上用 [TestResourceFilter] 替换了我的授权属性,并按预期得到了 401 Unauthorized。但这是使用资源过滤器的糟糕方式。

我的需求实现有什么问题?为什么我得到 500 而不是 401(或 403)?

编辑: 我发现 InvalidOperationException: No authenticationScheme was specified, and there is no DefaultChallengeScheme found. 在我的日志中。我看到了带有 cookies 方案的示例,但它不适合我。因为我要实现无状态调用。

最佳答案

poke 的 commnets 指出我以错误的方式实现了我的功能。我试图处理授权级别的安全检查,但我必须在身份验证级别上进行。所以我的最终代码如下:

public class TestHandlerOptions : AuthenticationSchemeOptions { }

internal class TestHandler : AuthenticationHandler<TestHandlerOptions> {
protected override async Task<AuthenticateResult> HandleAuthenticateAsync() {
if (await SomeCheckAsync()) {
var identity = new ClaimsIdentity(ClaimsName);
var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), null, ClaimsName);
return AuthenticateResult.Success(ticket);
}

return AuthenticateResult.Fail("Missing or malformed 'Authorization' header.");
}
}

Startup类的ConfigureServices中添加下一个:

services.AddAuthentication(options => options.AddScheme(SchemeName, o => o.HandlerType = typeof(TestHandler)));

授权属性看起来像[Authorize(AuthenticationSchemes = SchemeName)]

关于c# - ASP.NET Core 中失败的授权要求的错误状态代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46063002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com