j'ai fait dans une application énorme d'avoir beaucoup de différentes autorisations et des rôles différents quelque chose comme [je n'ai pas le code ici, donc je vais essayer de le recréer ici]:
I Mis en œuvre une classe appelée SecuredPage comme suit:
public class SecuredPage : System.Web.UI.Page
{
// Those Permissions are mandatory, so user needs to have all of them
public List MandatoryPermissions { get; set; }
// Those Permissions are optional, so if the user have at least one of them, he can access
public List OptionalPermissions { get; set; }
protected override void OnLoad(EventArgs e)
{
MyUser loggedUser = (MyUser) this.User;
base.OnLoad(e);
foreach (Permission mandatoryPermission in MandatoryPermissions)
{
// if the user don't have permission, we can redirect him
if (!loggedUser.HasPermission(mandatoryPermission))
{
RedirectToDontHaveAccess();
break;
}
}
bool hasAccessToThePage = false;
foreach (Permission optionalPermission in OptionalPermissions)
{
// If the user has at least one of the permissions, he can access
if (loggedUser.HasPermission(optionalPermission))
{
hasAccessToThePage = true;
}
}
if (!hasAccessToThePage)
{
RedirectToDontHaveAccess();
}
}
private void RedirectToDontHaveAccess()
{
throw new NotImplementedException();
}
}
Ce sera mon BasePage pour toutes les pages que les utilisateurs ont besoin d'autorisations d'accès. Les MandatoryPermissions
sont des autorisations que l'utilisateur DOIT avoir tous pour accéder à la page et OptionalPermissions
sont des autorisations que l'utilisateur a besoin d'au moins un d'entre eux pour accéder à la page. Il n'est pas nécessaire d'utiliser les deux sur chaque page, car si vous avez MandatoryPermissions
, cela n'a pas d'importance si vous avez les options ou non.
Permission est un ENUM:
public enum Permission
{
// Usually this enum will replicate a domain table from the database
EditUser = 1,
SearchUserByUsername = 2,
SearchUserByEmail = 3
}
Et MyUser
est une implémentation de MembershipUser
:
public class MyUser : System.Web.Security.MembershipUser
{
internal bool HasPermission(Permission permission)
{
//
// TODO: Check on database if the user has the permission or not
//
}
}
la seule chose que vous devez faire dans vos pages est de remplir les listes d'autorisations:
public partial class EditUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
MandatoryPermissions.Add(Permission.EditUser);
}
}
public partial class SearchUser : SecuredPage
{
protected void Page_Load(object sender, EventArgs e)
{
OptionalPermissions.Add(Permission.SearchUserByUsername);
OptionalPermissions.Add(Permission.SearchUserByEmail);
}
}
OK, l'exemple de recherche n'était pas très bon mais je pense que vous obtenez l'image.
L'idée générale est que base.OnLoad(e);
est appelée juste avant la vérification des autorisations, il vous suffit donc de remplir les permissions dans votre Page_Load
.
Je ne suis pas sûr que ce soit la meilleure solution, mais je suis sûr que ça aide beaucoup :)
J'ai implémenté un MembershipProvider et un RoleProvider. Mes questions sont comment vous découpler l'autorisation des pages individuelles. Je veux dire, mettez-vous un Roles.IsInRole ("admin") dans chacune de vos pages? Utilisez-vous les éléments d'emplacement web.config? Ou avez-vous une autre façon de le découpler des pages? – JohannesH
Ah, ok, donc je vais éditer ma réponse pour montrer comment je fais habituellement :) Juste une seconde – homemdelata
Oui, l'approche de type "page de base" est ce que nous faisons aussi - Avoir une page de base qui gère toutes les authentification/accès contrôle, etc, et quelques autres fonctions, puis héritent des pages individuelles de cela. –