0

我对编程很陌生,而且我的英语很差,所以如果这篇文章让你感到困惑,我很抱歉。

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

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

所以表格看起来像这样

UserId   CompanyId   Role
   1        A         User
   1        A         Admin
   1        B         User
   2        B         Admin
   2        C         User
   3        A         Admin
   3        C         Admin
4

2 回答 2

0

成员资格提供者控制每个用户拥有的角色。它通常在逐个用户的基础上执行此操作,而不是针对用户/公司。您已经在使用[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
}

假设您可能想检查用户是否有很多访问权限,可以将此功能移到 aBaseController中,以便您可以在任何地方访问它。

于 2013-10-07T17:10:37.260 回答
0

您不需要[Authorize(Roles = "Admin")]此 porpouse 的属性,因为您需要的用户可能会以不同的方式看到相同的视图,具体取决于公司中的角色。但是,如果您添加[Authorize(Roles = "Admin")],用户将始终将其视为管理员。

所以,我假设,你有两个模型——User class来自会员和Company class像这样

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
    }

}
于 2013-10-07T19:46:55.847 回答