10

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

假设有一个控制器

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

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

  1. 添加角色以授权属性

  2. 动态地将控制器操作权限分配给角色

  3. 动态添加角色以授权控制器的属性(错误:处理方法 - 找不到合适的方法来覆盖)

  4. 基于策略的授权可以更加动态吗

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

4

3 回答 3

15

你不能那样做。[Authorize(Roles=//set dynamically)]必须在编译时知道。正如吹镖的评论链接帖子中指出的那样,不鼓励出于这个原因使用角色。

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

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

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

IE

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

等等

从评论更新。

您应该能够使用 ASP.NET Core Identity 的声明和角色声明功能,而无需更改一行代码,因此您拥有IdentityRoleIdentityRoleClaim类。在运行时,您添加一个新的IdentityRole(即“管理器”),然后添加多个IdentityRoleClaim(每个权限/策略一个)

于 2017-06-28T07:20:55.197 回答
0

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

于 2020-03-19T20:00:32.007 回答
-5
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");
       }
于 2019-10-23T09:21:31.503 回答