Asp.net mvc MVC中基于项目的角色

Asp.net mvc MVC中基于项目的角色,asp.net-mvc,roles,Asp.net Mvc,Roles,我是一个编程新手,我的英语很差,所以如果这篇文章把你搞糊涂了,我很抱歉 我正在实现一个基本的ASP.NETMVCWeb应用程序,它将管理公司的信息。 此应用程序中有两个页面。 一个用于查看信息,无需任何东西即可访问此页面。 另一个是编辑信息,你可以访问这个页面,如果你有公司的管理员角色 public ActionResult ViewInfo(string companyId) { return View(); } [Authorize(Role

我是一个编程新手,我的英语很差,所以如果这篇文章把你搞糊涂了,我很抱歉

我正在实现一个基本的ASP.NETMVCWeb应用程序,它将管理公司的信息。 此应用程序中有两个页面。 一个用于查看信息,无需任何东西即可访问此页面。 另一个是编辑信息,你可以访问这个页面,如果你有公司的管理员角色

    public ActionResult ViewInfo(string companyId)
    {
        return View();
    }

    [Authorize(Roles = "Admin")]
    public ActionResult EditInfo(string companyId)
    {
        return View();
    }
如果我有一个可以访问2家公司的帐户,但该帐户在这两家公司中的角色完全不同。(例如,该帐户是A公司的管理员和B公司的正常用户)

有没有什么简单的方法可以让我的角色基于我将进入的公司?我尝试过使用自定义RoleProvider,但似乎无法将其他参数传递给该方法

有点像这样

public class CustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
          string companyId = GetCompanyId();    // Is there any good way to get this companyId from the Controller?
          return userCompanyRoles.Any(u => u.Username == username && u.CompanyId == companyId && u.Roles.Any(r => r.Name == roleName));
    }

    ...

}
编辑

我的应用程序中有4种型号:

   public class User {
       public string Id { get; set;}
       ...
   }

    public class Company {
       public string Id { get; set;}
       ...
    }

    public class Role {
       public string Name { get; set;}
       ...
    }

    public class UserCompanyRoles {
       public string UserId { get; set; }
       public string CompanyId { get; set; }
       public List<string> Roles { get; set; }
    }

成员资格提供程序控制每个用户的角色。它通常是在用户对用户的基础上,而不是在用户/公司的基础上进行。 通过使用
[Authorize(Roles=“Admin”)]

但是,听起来您想检查当前用户是否有权访问当前公司。你可以这样做

[Authorize(Roles = "Admin")]
public ActionResult EditInfo(string companyId)
{
    if (UserHasAccessToCompany(companyId))
    {
        return View();
    }
    return RedirectToAction("Index");
}

private bool UserHasAccessToCompany(string companyId)
{
    var company = companyRepository.GetCompanyById(companyId); // making the assumption you have a repository for companies
    return company.Users.Select(u => u.userId).Include(User.Identity.Name); // you can access the current user using the `User` from within the controller
}

假设您可能希望检查用户是否有很多访问权限,则可以将此功能移动到
BaseController
中,这样您就可以随时随地访问它。

此端口不需要
[Authorize(Roles=“Admin”)]
属性,因为您需要的用户可能会根据公司中的角色以不同的方式看到相同的视图。但如果您添加
[Authorize(Roles=“Admin”)]
,用户将始终将其视为管理员

因此,我假设您有两个模型-
用户类和
公司类

UserId   CompanyId   Role
   1        A         User
   1        A         Admin
   1        B         User
   2        B         Admin
   2        C         User
   3        A         Admin
   3        C         Admin
public class Company
{
  public int companyID {get; set;}
  public straing companyName {get; set;}
}
对于我来说,最简单的解决方案是使用第三个具有角色的联接表:

//In real application userID will be Guid if you use Membership and int if you use SimpleMembership

    userID  companyID    role
      1        2        "Admin"
      1        3         "User"

public class MyRole
{
public Guid userID {get; set;} 
public int companyID {get; set;}
public string roleName {get; set;}

}
现在,您可以按如下方式使用它:

public ActionResult CompanyDetails (int id)
{
   var user = Membership.GetUser(User.Identity.Name);
   Guid currentUserID = (Guid)user.ProviderUserKey;
   MyRole userRole = db.MyRoles.Where(g=>g.userID = currentUserID & g.companyID = id); // get user role
   string roleName = userRole.roleName; // get role name

   bool isAdmin = roleName == "Admin"? true : false;

   if(isAdmin)
   {
    //return as for admin

   }
   else
   {
    // return as for user
    }

}

你有没有想过会有两个以上的公司?@ErikPhilips当然有!不同的角色也会有更多的页面,这是不对的。我有4个存储库,分别是:用户、角色、公司、用户公司。我将编辑问题以使其更清楚。好的,请更改
UserHasAccessToCompany
函数中的逻辑,使其返回正确答案。请记住,通过为每个公司添加不同的角色,您可能会使成员/角色模式发生很大的变化。我怀疑您尝试在过滤器中执行的操作是否可行,因为您需要传入一个变量以了解它是哪家公司。这可能是一个解决方案,但这不意味着我需要为我将要拥有的每个视图都输入过滤代码吗?我正在考虑使用自定义角色提供程序,它可以根据用户要访问的公司ID为用户返回正确的角色。这样,我就可以在每个视图中简单地使用带有角色过滤的Authorize标记。但我不确定这是否可行,也不确定这是否是一种好的做法。@BPRW您可以尝试根据该筛选创建自定义操作筛选器: