【发布时间】:2020-04-02 19:27:16
【问题描述】:
我有一个授权处理程序,在成功时工作,但在...失败时失败。
这里是:
public class HeaderHandler : AuthorizationHandler<HeaderRequirement>
{
private readonly IHttpContextAccessor _httpContextAccessor;
public HeaderHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
protected async override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
HeaderRequirement requirement)
{
var Request = _httpContextAccessor.HttpContext.Request;
try
{
var authHeader = AuthenticationHeaderValue.Parse(Request.Headers["Authorization"]);
var credentialBytes = Convert.FromBase64String(authHeader.Parameter);
var credentials = Encoding.UTF8.GetString(credentialBytes).Split(new[] { ':' }, 2);
context.Succeed(requirement);
}
catch (Exception ex)
{
context.Fail();
}
}
}
它是这样配置的:
services.AddAuthorization(options =>
{
options.AddPolicy(nameof(Policy.AuthorizationHeader), //an enum of mine...
policy => policy.Requirements.Add(new HeaderRequirement()));
});
这是我在控制器中使用它的方式:
[Authorize(Policy = nameof(Policy.AuthorizationHeader))]
public async Task<IActionResult> CreateSpace([FromQuery] CreateSpaceViewModel viewModel)
{
//....
}
成功时效果很好,我达到了上面的代码。但是当我在处理程序中失败时:
System.InvalidOperationException: 没有 authenticationScheme 指定,并且没有找到 DefaultChallengeScheme。默认 可以使用 AddAuthentication(string defaultScheme) 或 AddAuthentication(Action 配置选项)。
好像失败时,我没有在Startup.cs 中设置处理程序。它提到了authentication,即使我没有使用它...
据我所知,Authentication 是让用户进入应用程序,Authorization 是限制已让用户访问某些资源。
但我正在编写 API,我不关心“应用程序”部分。我只想用属性来装饰某些动作......就像在.net 4.7中一样。
有什么想法吗?
【问题讨论】:
标签: c# asp.net-core-3.0