角色动态授权 asp.net 核心

Dynamic authorization of roles asp.net core

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

假设有一个控制器

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

我已经尝试了以下问题的解决方案

  1. dynamically assign controller action permissions to roles

  2. (错误:处理方法 - 找不到合适的方法来覆盖)

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

你不能那样做。 [Authorize(Roles=//set dynamically)] 必须在 编译时 知道。由于这个原因使用角色也是 令人沮丧的 正如 blowdart 的链接 post 从评论中指出的那样。

相反,您应该使用声明和政策。声明是细粒度的权限,例如 "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();
    }
}

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

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

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

根据评论更新。

You should be able to utilize ASP.NET Core Identity's claim and roleclaim abilities w/o changing a line of code, therefor you have the IdentityRole and IdentityRoleClaim classes. At runtime, you add a new IdentityRole (i.e. "Manager") and then add multiple IdentityRoleClaim (one for each permission/policy)

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");
       }

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