【发布时间】:2019-01-31 03:26:48
【问题描述】:
我有这个 Web API 项目,没有 UI。我的appsettings.json 文件有一个部分列出了令牌以及它们属于哪个客户端。所以客户端只需要在标头中提供一个匹配的令牌。如果没有提供令牌或令牌无效,则应返回 401。
在 ConfigureServices 我设置授权
.AddTransient<IAuthorizationRequirement, ClientTokenRequirement>()
.AddAuthorization(opts => opts.AddPolicy(SecurityTokenPolicy, policy =>
{
var sp = services.BuildServiceProvider();
policy.Requirements.Add(sp.GetService<IAuthorizationRequirement>());
}))
从我所看到的情况来看,这部分是正确的。 这是 ClientTokenRequirement 的代码
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ClientTokenRequirement requirement)
{
if (context.Resource is AuthorizationFilterContext authFilterContext)
{
if (string.IsNullOrWhiteSpace(_tokenName))
throw new UnauthorizedAccessException("Token not provided");
var httpContext = authFilterContext.HttpContext;
if (!httpContext.Request.Headers.TryGetValue(_tokenName, out var tokenValues))
return Task.CompletedTask;
var tokenValueFromHeader = tokenValues.FirstOrDefault();
var matchedToken = _tokens.FirstOrDefault(t => t.Token == tokenValueFromHeader);
if (matchedToken != null)
{
httpContext.Succeed(requirement);
}
}
return Task.CompletedTask;
}
当我们在ClientTokenRequirement 中并且没有匹配到它返回的令牌时
return Task.CompletedTask;
这是按照文档中记录的方式完成的 https://docs.microsoft.com/en-us/aspnet/core/security/authorization/policies?view=aspnetcore-2.1
当有一个有效的token时,这可以正常工作,但是当没有并且它返回Task.Completed时,没有401而是一个异常
InvalidOperationException: 没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme。
我已经阅读了关于使用身份验证而不是授权的其他 stackoverflow 文章,但实际上这个策略授权更适合目的。因此,我正在寻找有关如何防止此异常的想法。
【问题讨论】:
标签: c# asp.net-core authorization asp.net-core-2.0 asp.net-core-webapi