我正在尝试重写当前在ASP.NET Core中对ASP.NET 4.6的一些授权。

我知道授权有所变化,并且发现很难在ASP.NET Core中实现非常简单的身份验证策略。

我的要求:

对服务器的每个请求都应包含一个名为“key”的 header 。基于该键的值,我将能够查询数据库并检查该键是常规用户还是管理员用户。如果请求不包含有效的 key ,则该请求未被授权。

我将如何在ASP.NET Core中实现呢?我发现的每个示例似乎完全满足了我的需求。

在ASP.NET 4.6中,我在 Controller 上使用了自己的自定义AuthorizeAttributes,例如

[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}


[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() {}

我可以在ASP.NET Core中做同样的事情吗?

最佳答案

在ASP.NET Core中,建议您不要从AuthorizeAttribute继承。相反,您可以制定自定义授权策略:https://docs.microsoft.com/en-us/aspnet/core/security/authorization/claims

您将需要一个身份验证处理程序,该处理程序根据 header 为用户创建ClaimsIdentity。然后,您可以制定声明对用户存在某些声明的策略。

您可以在此处找到基本身份验证的实现:https://github.com/blowdart/idunno.Authentication
注意那里的巴里的评论,当然:



它的核心位于BasicAuthenticationHandler,它继承自AuthenticationHandler<BasicAuthenticationOptions>

此实现的主体是在开发人员制作的事件回调中创建的,在示例中为here:

if (context.Username == context.Password)
{
    var claims = new[]
    {
        new Claim(ClaimTypes.NameIdentifier, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer),
        new Claim(ClaimTypes.Name, context.Username, ClaimValueTypes.String, context.Options.ClaimsIssuer)
    };

    context.Principal = new ClaimsPrincipal(new ClaimsIdentity(claims, context.Scheme.Name));
    context.Success();
}

然后,在基于主体调用此回调之后,在处理程序中创建身份验证票证:
var ticket = new AuthenticationTicket(validateCredentialsContext.Principal, Scheme.Name);
return AuthenticateResult.Success(ticket);

我还写了一篇关于实现自定义身份验证方案的文章:Creating an authentication scheme in ASP.NET Core 2.0

09-10 00:43
查看更多