动态授权角色asp.net核心

时间:2017-06-28 06:03:39

标签: asp.net asp.net-core asp.net-identity authorize-attribute role-based-access-control

这不是一个重复的问题,或者说其他解决方案中给出的解决方案没有奏效。

让我们说有一个cntroller

[Authorize(Roles=//set dynamically)]
public IActionResult DashBoard(LoginModel model)
{
}

我在以下问题中尝试了解决方案

1) Add roles to authorize attribute

2) dynamically assign controller action permissions to roles

3)dynamically add roles to authorize attribute for controller(错误:处理方法 - 没有找到合适的方法来覆盖)

4)can policy based authorization be more dynamic

所有这些解决方案都不起作用,因为接口中覆盖的方法不存在(例如,authorizeAttribute不包含AuthorizeCore的定义),或者在某些情况下,IServiceCollection服务不包含特定方法

3 个答案:

答案 0 :(得分:7)

你不能这样做。必须在编译时知道[Authorize(Roles=//set dynamically)]。出于这个原因也使用角色是气馁,如评论中关于blowdart链接帖子所指出的那样。

相反,您应该使用声明和政策。声明是细粒度的权限,例如" CreateCustomer"或" DeleteCustomer"或" ViewDashboard"。

所以你必须像

一样使用它
[Authorize(Policy = "ViewDashboard")]

这些策略需要在编译时知道。

public class ViewDashboardRequirement : AuthorizationHandler<ViewDashboardRequirement>, IAuthorizationRequirement
{
    public override void Handle(AuthorizationContext context, ViewDashboardRequirement requirement)
    {
        if (context.User.HasClaim(c => c.Type == "dashboard:read"))
        {
            context.context.Succeed(requirement);
            return;
        }

        // only call fail if you do not want that other AuthorizationHandler may succeed with 
        // a different requirement
        // context.Fail();
    }
}

有关如何生成通用处理程序的示例(而不是为每个策略编写新的Handler),请参阅我的回答here

这将允许您创建可配置的角色。现在,您可以创建包含一系列声明的角色。每项索赔可能是一项政策。当用户登录时,您将属于角色的声明添加到用户声明列表中。

即。

  • 支持:ViewDashboard,ViewCustomers,ViewContacts,ManageCases(支持票证)
  • 经理:ViewDashboard,ManageCustomers(查看,编辑,删除),ManageContacts(查看,编辑,删除)
  • 管理员:ManageDashboard(查看,编辑)

等。

从评论更新。

  

您应该能够利用ASP.NET Core Identity的声明和roleclaim功能而无需更改一行代码,因此您拥有IdentityRoleIdentityRoleClaim类。在运行时,您添加新的IdentityRole(即&#34;经理&#34;),然后添加多个IdentityRoleClaim(每个权限/政策一个)

答案 1 :(得分:0)

我认为您必须使用策略代替授权角色。 实际上,基于策略与基于角色的好处之一就是这个。

答案 2 :(得分:-1)

public IActionResult Validate(LoginDetails userobj)
       {
          LoginDetails user = new LoginDetails();
         var checklogin = from s in appDbContext.loginDetails where s.UserName == userobj.UserName && s.Password == userobj.Password select s;

               if (checklogin != null && checklogin.Count() > 0)
               {
                   if (checklogin.FirstOrDefault().Role == 1)
                   {
                       return RedirectToAction("Home");
                   }
                   else if (checklogin.FirstOrDefault().Role == 2)
                   {
                       var UserId = checklogin.FirstOrDefault().LoginId;
                       HttpContext.Session.SetInt32("UserId", UserId);
                       return RedirectToAction("Index1");
                   } 
           }

           return RedirectToAction("Failed");
       }