2008-10-17 4 views
6

Ich habe folgendes in meinem web.config:Wie kann ich in meiner Codebehind-Klasse die autorisierten Rollen abrufen?

<location path="RestrictedPage.aspx"> 
    <system.web> 
     <authorization> 
      <allow roles="Group1Admin, Group3Admin, Group7Admin"/> 
      <deny users="*"/> 
     </authorization> 
    </system.web> 
</location> 

Innerhalb RestrictedPage.aspx.cs, wie rufe ich die Sammlung erlaubt Rollen, die Group1Admin, Group3Admin enthält, und Group7Admin?

Hier ist, warum ich fragen:

Die web.config die Berechtigung auf die Seite verarbeitet. Das funktioniert gut. Aber ich werde ein paar dieser Seiten haben (sagen wir RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Jede dieser Seiten wird mein benutzerdefiniertes Webcontrol enthalten. Und jede dieser Seiten wird unterschiedliche Rollen haben. Mein Webcontrol hat eine Dropdown-Liste. Die Auswahlmöglichkeiten innerhalb des Dropdown-Menüs hängen von der Schnittmenge der Rollen des Benutzers und der zulässigen Rollen der Seite ab.

Wie unten erwähnt, würde wahrscheinlich das Durchsuchen der web.config mit XPath funktionieren. Ich habe nur auf etwas mehr Framework gehofft. So ähnlich wie SiteMap. Wenn ich Rollen in meine web.sitemap lege, kann ich sie mithilfe von SiteMap.CurrentNode.Roles (meine Website verwendet die Windows-Authentifizierung), also kann ich web.sitemap nicht für die Sicherheit trimmen und ich würde lieber Rollen in nur einer Datei).

Antwort

3
// set the configuration path to your config file 
string configPath = "??"; 

Configuration config = WebConfigurationManager.OpenWebConfiguration(configPath); 

// Get the object related to the <identity> section. 
AuthorizationSection section = (AuthorizationSection)config.GetSection("system.web/authorization"); 

aus dem Abschnitt Objekt das AuthorizationRuleCollection Objekt, wo Sie kann dann die Rollen extrahieren.

Hinweis: Sie müssen wahrscheinlich den Pfad zu dem Abschnitt ein wenig ändern, da Sie mit "location path =" RestrictedPage.aspx "" beginnen, ich habe dieses Szenario nicht versucht.

+0

Perfekt! Hier ist meine letzte Zeile: AuthorizationSection section = (AuthorizationSection) WebConfigurationManager.GetSection ("system.web/authorization", Request.Path); Request.Path navigiert zu location = "RestrictedPage.aspx" (wenn es sich um die aktuelle Seite handelt). Danke! –

+0

Um die aktuelle web.config für die Variable configPath abzurufen - ersetzen Sie sie mit oder setzen Sie sie auf "~", wie in dieser Antwort beschrieben [hier] (http://stackoverflow.com/a/4134213/603807) – dyslexicanaboko

0
if {User.IsInRole("Group1Admin"){//do stuff} 

Ist es das, was Sie fragen?

0

Ich bin mir nicht sicher, aber ich hätte gedacht, dass dies überprüft wird, bevor Ihre Seite überhaupt verarbeitet wird, also wenn ein Benutzer nicht in einer Rolle ist, würden sie nie Ihre Seite erreichen. Was letztendlich die Sichtbarkeit dieser Seite in der Seite überflüssig machen würde.

+1

Wenn sich der Benutzer jedoch in einer der autorisierten Rollen befindet, möchten Sie vielleicht trotzdem wissen, in welcher Rolle er sich befindet, richtig? – DOK

0

Ich bin davon überzeugt, dass es eine bessere Möglichkeit gibt, diese Informationen zu lesen, aber hier ist eine Möglichkeit, die Werte aus einer Datei web.config zu lesen.

XmlDocument webConfigReader = new XmlDocument(); 
webConfigReader.Load(Server.MapPath("web.config")); 

XmlNodeList root = webConfigReader.SelectNodes("//location[@path="RestrictedPage.aspx"]//allow//@roles"); 

foreach (XmlNode node in root) 
{ 
    Response.Write(node.Value); 
} 

Natürlich ist der ASP.NET Rollenanbieter wird damit umgehen für Sie, damit diese Werte zu lesen ist wirklich nur dann relevant, wenn Sie planen, in dem mit ihnen etwas zu tun Code-behind neben Autorisierung von Benutzern, die können Sie tun.

Hoffe, dass dies hilft - Sie müssen möglicherweise Ihr Ergebnis mit dem, Zeichen teilen.

0

Was normalerweise passiert, ist dies ...

Wenn der Benutzer trifft Ihrer Seite, wenn die Authentifizierung/Autorisierung aktiv ist, wird das Application_Authentication Ereignis ausgelöst hat. Wenn Sie die Windows-Authentifizierung für etwas wie Active Directory nicht verwenden, stehen Ihnen die IPrincipal- und Identity-Objekte nicht zur Verfügung, sodass Sie nicht auf die User.IsInRole() -Methode zugreifen können. Allerdings können Sie dies tun, indem Sie den folgenden Code in die Datei Global.asax hinzu:

Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs) 

     Dim formsAuthTicket As FormsAuthenticationTicket 
     Dim httpCook As HttpCookie 
     Dim objGenericIdentity As GenericIdentity 
     Dim objMyAppPrincipal As CustomPrincipal 
     Dim strRoles As String() 

     Log.Info("Starting Application AuthenticateRequest Method...") 

     httpCook = Context.Request.Cookies.Get("authCookieEAF") 
     formsAuthTicket = FormsAuthentication.Decrypt(httpCook.Value) 
     objGenericIdentity = New GenericIdentity(formsAuthTicket.Name) 
     strRoles = formsAuthTicket.UserData.Split("|"c) 
     objMyAppPrincipal = New CustomPrincipal(objGenericIdentity, strRoles) 
     HttpContext.Current.User = objMyAppPrincipal 

     Log.Info("Application AuthenticateRequest Method Complete.") 

End Sub 

Dies wird ein Cookie in der Browser-Sitzung mit den richtigen Benutzer- und Rollenanmeldeinformationen setzen Sie in der Web-App zugreifen können.

Im Idealfall wird Ihr Benutzer nur in einer Rolle in einer Anwendung sein, deshalb glaube ich, dass Ihnen die Methode zur Rollenprüfung zur Verfügung steht. Es wäre leicht genug, um eine Hilfsmethode für Sie zu schreiben, die durch die Liste der Rollen in der Anwendung und Test, um zu sehen, welche Rolle sie in iterieren würde.

Verwandte Themen