0

私はプログラミングの初心者で、英語もかなり下手なので、この投稿があなたを混乱させてしまったら申し訳ありません。

企業の情報を管理する基本的な ASP .NET MVC Web アプリケーションを実装しています。このアプリケーションには 2 つのページがあります。1 つは、このページにアクセスするために何も必要としない情報を表示するためのものです。もう 1 つは、会社の管理者ロールを持っている場合にのみこのページにアクセスできる情報を編集するためのものです。

    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")]と、ユーザーには常に管理者として表示されます。

したがって、User classメンバーシップとCompany classこのような2つのモデルがあると思います

public class Company
{
  public int companyID {get; set;}
  public straing companyName {get; set;}
}

私にとって最も簡単な解決策は、役割を持つ3番目の結合テーブルを持つことです。

//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 に答える
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
}

ユーザーが頻繁にアクセスできるかどうかを確認したい場合、この関数を に移動して、BaseControllerどこからでもアクセスできるようにすることができます。

于 2013-10-07T17:10:37.260 に答える