habe ich in einer großen Anwendung viele unterschiedliche Berechtigungen und verschiedene Rollen in etwa wie folgt mit [ich den Code nicht hier haben, so werde ich nur versuchen, es neu zu erstellen hier]:
ich zum ersten Mal umgesetzt eine Klasse namens SecuredPage, wie folgend:
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();
}
}
Dies wird meine Basepage für alle Seiten, die Benutzer benötigen Berechtigungen für den Zugriff sein. Die MandatoryPermissions
sind Berechtigungen, die Benutzer müssen alle von ihnen haben auf die Seite zugreifen und OptionalPermissions
sind Berechtigungen, die Benutzer zumindest einer von ihnen muss auf die Seite zuzugreifen. Es gibt keine Notwendigkeit, beide, weil auf jeder Seite zu verwenden, wenn Sie MandatoryPermissions
haben keine Rolle, ob Sie die optionals haben oder nicht.
Genehmigung ist ein Enum:
public enum Permission
{
// Usually this enum will replicate a domain table from the database
EditUser = 1,
SearchUserByUsername = 2,
SearchUserByEmail = 3
}
Und MyUser
ist eine Implementierung von 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
//
}
}
Dann ist die einzige Sache, die Sie in Ihren Seiten tun müssen, ist die Berechtigungen Listen zu füllen:
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, das Suchbeispiel war nicht so gut, aber ich denke, Sie bekommen das Bild.
Die ganze Idee ist, dass base.OnLoad(e);
kurz vor der Überprüfung der Berechtigungen aufgerufen wird, so dass Sie nur die Berechtigungen in Ihrem Page_Load
ausfüllen müssen.
Ich bin mir nicht sicher, ob dies die beste Lösung ist, aber ich bin sicher, dass es eine Menge :)
Ich habe einen MembershipProvider und einen RoleProvider implementiert. Meine Fragen sind, wie Sie die Autorisierung von den einzelnen Seiten entkoppeln. Ich meine, setzen Sie eine Roles.IsInRole ("admin") in jede Ihrer Seiten? Verwenden Sie web.config Standortelemente? Oder haben Sie eine andere Möglichkeit, es von den Seiten zu entkoppeln? – JohannesH
Ah, ok, also werde ich meine Antwort bearbeiten, um zu zeigen, wie ich es normalerweise tue :) Nur eine Sekunde – homemdelata
Ja, der Ansatz der "Basisseite" ist das, was wir auch tun - eine Basisseite haben, die alle Authentifizierungen/Zugriffe behandelt Kontrolle, usw., und ein paar andere Funktionen, und erben dann die einzelnen Seiten davon. –