【发布时间】:2018-09-12 04:33:07
【问题描述】:
我们有一个 Net Core 2.1 API 项目。我们使用请求标头来检索 API 密钥,我们检查我们的数据库以查看它是否与预期的密钥之一匹配。如果是,那么我们允许请求继续,否则我们想发回未经授权的响应。
我们的 startup.cs
services.AddAuthorization(options =>
{
options.AddPolicy("APIKeyAuth", policyCorrectUser =>
{
policyCorrectUser.Requirements.Add(new APIKeyAuthReq());
});
});
services.AddSingleton<Microsoft.AspNetCore.Authorization.IAuthorizationHandler, APIKeyAuthHandler>();
我们的 APIKeyAuthHandler.cs
public class APIKeyAuthReq : IAuthorizationRequirement { }
public class APIKeyAuthHandler : AuthorizationHandler<APIKeyAuthReq>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, APIKeyAuthReq requirement)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
if (requirement == null)
throw new ArgumentNullException(nameof(requirement));
var httpContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
var headers = httpContext.HttpContext.Request.Headers;
if (headers.TryGetValue("Authorization", out Microsoft.Extensions.Primitives.StringValues value))
{
using (DBContext db = new DBContext ())
{
var token = value.First().Split(" ")[1];
var login = db.Login.FirstOrDefault(l => l.Apikey == token);
if (login == null)
{
context.Fail();
httpContext.HttpContext.Response.StatusCode = 403;
return Task.CompletedTask;
} else
{
httpContext.HttpContext.Items.Add("CurrentUser", login);
context.Succeed(requirement);
return Task.CompletedTask;
}
}
}
}
}
还有我们的controller.cs
[Route("api/[controller]/[action]")]
[Authorize("APIKeyAuth")]
[ApiController]
public class SomeController : ControllerBase
{
}
当有效密钥存在时一切正常,但当它不存在时,会为 No authenticationScheme 而不是 403 引发 500 内部错误。
我们对 net core(来自 Net Framework/Forms Authentication)相对较新,所以如果有更准确的方法来进行这种身份验证,请告诉我。
错误信息:
InvalidOperationException:未指定 authenticationScheme,并且 没有找到 DefaultChallengeScheme。 Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext 上下文、字符串方案、AuthenticationProperties 属性)
【问题讨论】:
-
我认为您应该考虑使用基于令牌的身份验证。您可以查看此链接-stackoverflow.com/questions/38661090/…
-
似乎基于令牌的身份验证适用于您有用户名/密码开始的情况?我们的应用程序将基于存储在数据库中的静态 API 密钥。我相信基于令牌的身份验证在我们的案例中不起作用,除非我遗漏了一些东西
-
我建议您为您的身份验证方法创建一个身份验证方案。然后,您可以根据您的方案创建的用户主体进行授权。例如。 joonasw.net/view/creating-auth-scheme-in-aspnet-core-2
-
删除
[Authorize("APIKeyAuth")]
标签: c# asp.net-core .net-core asp.net-core-2.0 asp.net-core-2.1