如何在ASP Core 2中构建基于角色的自定义授权?

时间:2017-11-14 16:20:23

标签: c# asp.net asp.net-core

我有一个数据库,它有一个用户表,访问表和一个将用户分配给多个访问权限的连接表。该站点将通过将AD中的身份用户名与Users表中的用户名进行匹配来验证用户,以验证他们是否可以看到该站点(Intranet)。访问表用于指定允许访问的页面。

在ASP Core 2中,如何使用Authorization在Startup上执行相同的检查以验证它们是否在Users表中,然后更进一步并使用Roles允许用户访问特定的Web页面。

我已经浏览了文档,但我无法弄清楚要走哪条路,因为这些示例使用的登录在我使用AD的情况下是不必要的。

我有一个用户表,并且不使用AD角色,因为我们有一个管理员进行交换,而我无权访问。

提前致谢

1 个答案:

答案 0 :(得分:2)

授权属性是您正在寻找的。例如,

[Authorize(Roles = "Admin, User")]

如果您使用OAuth进行身份验证,则会在进行身份验证时创建一个ClaimsIdentity。根据声明,Authorize属性将开箱即用。例如,

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(oAuthIdentity);
    }

您可以参考this post,其中我更详细地解释了类似的情况。