根据ASP.NET Core

时间:2017-02-06 14:13:47

标签: asp.net-core authorization asp.net-authorization asp.net-core-identity

我试图重写一些我目前在ASP.NET Core中为ASP.NET 4.6提供的授权。

我知道Authorization已经发生了一些变化,我发现很难在ASP.NET Core中实现我非常简单的auth策略。

我的要求:

对服务器的每个请求都应包含名为" key"的标头。根据该密钥的值,我将能够查询数据库并检查该密钥是代表普通用户还是管理员用户。如果请求不包含有效密钥,则该请求未被授权。

我如何在ASP.NET Core中实现它?我发现的每一个例子对我的需求来说都显得过于苛刻。

在ASP.NET 4.6中,我使用自己的自定义AuthorizeAttributes在我的控制器上使用,例如

[User]
public IHttpActionResult DoSomethingOnlyUsersCanDo() {}

[Admin]
public IHttpActionResult DoSomethingOnlyAdminsCanDo() {}

我可以在ASP.NET Core中执行相同操作吗?

1 个答案:

答案 0 :(得分:6)

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

您需要拥有一个身份验证处理程序,根据标头为用户创建一个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