Question

J'ai les éléments suivants dans mon Web.config:

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

Dans RestrictedPage.aspx.cs, comment puis-je récupérer la collection de rôles autorisés contenant Group1Admin, Group3Admin et Group7Admin?

Voici pourquoi je demande:

Le serveur web.config gère l'autorisation de la page. Cela fonctionne bien. Mais je vais avoir quelques-unes de ces pages (disons RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Chacune de ces pages va avoir mon contrôle Web personnalisé sur elle. Et chacune de ces pages aura différents rôles autorisés. Mon webcontrol a une liste déroulante. Les choix dans la liste déroulante dépendent de l'intersection des rôles de l'utilisateur et des rôles autorisés de la page.

Comme mentionné ci-dessous, une recherche dans le fichier web.config avec XPath fonctionnerait probablement. J'espérais juste quelque chose de plus cadre. Un peu comme SiteMap. Lorsque je mets des rôles dans mon web.sitemap, je peux les récupérer à l'aide de SiteMap.CurrentNode.Roles (mon site Web utilise l'authentification Windows, je ne peux donc pas utiliser web.sitemap pour le rognage de sécurité et je préfère conserver les rôles dans un seul fichier).

Était-ce utile?

La solution

// 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");

à partir de l'objet section, obtenez l'objet AuthorizationRuleCollection dans lequel vous pouvez ensuite extraire les rôles.

Remarque: vous devrez probablement modifier légèrement le chemin d'accès à la section car vous commencez par "location path =", vous ne pouvez pas utiliser ce scénario.

Autres conseils

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

Est-ce ce que vous demandez?

Je n'en suis pas certain, mais j'aurais pensé que cela était vérifié avant même le traitement de votre page. Par conséquent, si un utilisateur ne joue pas un rôle, il ne pourra jamais accéder à votre page. Ce qui rendrait en fin de compte la visibilité de cette page dans la page.

Je suis convaincu qu'il existe un meilleur moyen de lire ces informations, mais voici un moyen de lire les valeurs autorisées à partir d'un fichier web.config.

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

Bien sûr, le fournisseur de rôle ASP.NET gérera cela pour vous. Par conséquent, la lecture de ces valeurs n’est vraiment utile que si vous envisagez de faire quelque chose avec elles dans le code-behind en plus de l’autorisation des utilisateurs, ce que vous êtes en train de faire.

J'espère que cela vous aidera - vous devrez peut-être diviser votre résultat à l'aide du caractère.

Ce qui se passe généralement est-ce ...

Lorsque l'utilisateur accède à votre page, si authentification / autorisation est active, l'événement Application_Authentication est déclenché. Sauf si vous utilisez l'authentification Windows avec un élément tel qu'Active Directory, les objets IPrincipal et Identity ne seront pas disponibles, vous ne pourrez donc pas accéder à la méthode User.IsInRole (). Cependant, vous POUVEZ faire cela en ajoutant le code suivant dans votre fichier Global.asax:

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

Ceci placera un cookie dans la session du navigateur avec les informations d'identification d'utilisateur et de rôle appropriées, auxquelles vous pourrez accéder dans l'application Web.

Idéalement, votre utilisateur ne jouera qu'un rôle dans une application. Je pense donc que vous avez la méthode de vérification du rôle à votre disposition. Il serait assez facile d'écrire pour vous une méthode d'assistance qui parcourrait la liste des rôles dans l'application et testerait le rôle dans lequel ils se trouvent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top