Pregunta

Tengo lo siguiente en mi web.config:

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

En RestrictedPage.aspx.cs, ¿cómo recupero la colección de roles permitidos que contiene Group1Admin, Group3Admin y Group7Admin?

He aquí por qué pregunto:

El web.config está manejando la autorización a la página. Eso funciona bien. Pero voy a tener un par de estas páginas (por ejemplo, RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Cada una de estas páginas tendrá mi control web personalizado. Y cada una de estas páginas tendrá diferentes roles permitidos. Mi control web tiene una lista desplegable. Las opciones dentro de la lista desplegable dependen de la intersección de los roles del usuario y los roles permitidos de la página.

Como se menciona a continuación, la búsqueda en el web.config con XPath probablemente funcionaría. Solo estaba esperando algo más de framework-y. Algo así como SiteMap. Cuando coloco roles en mi web.sitemap, puedo capturarlos usando SiteMap.CurrentNode.Roles (mi sitio web usa la autenticación de Windows, por lo que no puedo usar web.sitemap para el recorte de seguridad y prefiero mantener los roles en uno solo archivo).

¿Fue útil?

Solución

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

en el objeto de sección, obtenga el objeto AuthorizationRuleCollection donde puede extraer los roles.

Nota: es probable que tengas que modificar un poco la ruta a la sección ya que comienzas con " ruta de ubicación = " RestrictedPage.aspx " " ;, no probé ese escenario.

Otros consejos

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

¿Es eso lo que estás preguntando?

No estoy seguro, pero hubiera pensado que esto se verifica antes de que su página sea procesada, por lo que si un usuario no tiene un rol nunca llegará a su página. Lo que en última instancia haría que la visibilidad de este redundante en la página.

Estoy convencido de que hay una mejor manera de leer esta información, pero aquí hay una manera en que puedes leer los valores permitidos de un archivo 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); 
} 

Por supuesto, el proveedor de roles ASP.NET se encargará de esto por usted, por lo que leer estos valores solo es realmente relevante si planea hacer algo con ellos en el código subyacente además de autorizar a los usuarios, lo que puede estar haciendo.

Espero que esto te ayude, es posible que tengas que dividir el resultado usando el carácter,.

Lo que generalmente sucede es esto ...

Cuando el usuario llega a su página, si la autenticación / autorización está activa, se genera el evento Application_Authentication. A menos que esté usando la autenticación de Windows contra algo como Active Directory, los objetos IPrincipal e Identity no estarán disponibles para usted, por lo que no puede acceder al método User.IsInRole (). Sin embargo, PUEDE hacer esto agregando el siguiente código en su archivo 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

Esto colocará una cookie en la sesión del navegador con las credenciales de usuario y roles adecuadas a las que puede acceder en la aplicación web.

Idealmente, su usuario solo tendrá un rol en una aplicación, por lo que creo que es por eso que tiene disponible el método de verificación de roles. Sería bastante fácil escribir un método de ayuda para usted que repita la lista de roles en la aplicación y pruebe para ver en qué rol están.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top