2008-10-17 10 views
6

Tengo el siguiente en mi web.config:En mi clase codebehind, ¿cómo recupero los roles autorizados?

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

Dentro RestrictedPage.aspx.cs, ¿cómo puedo recuperar la colección papeles permitido que contiene Group1Admin, Group3Admin y Group7Admin?

Aquí es por lo que pido:

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 webcontrol tiene una lista desplegable. Las opciones dentro del menú 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, probablemente funcione la búsqueda en web.config con XPath. Solo esperaba algo más framework-y. Algo así como SiteMap. Cuando pongo roles en mi web.sitemap, puedo tomarlos usando SiteMap.CurrentNode.Roles (mi sitio web usa autenticación de Windows, así que no puedo usar web.sitemap para el recorte de seguridad y prefiero mantener roles en solo uno archivo).

Respuesta

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

del objeto de sección conseguir el objeto AuthorizationRuleCollection donde puede luego extraer los Roles.

Nota: Probablemente necesite modificar la ruta de acceso a la sección un poco ya que comienza con "location path =" RestrictedPage.aspx "", no probé ese escenario.

+0

¡Perfecto! Aquí está mi última línea: Sección de AuthorizationSection = (Sección de Autorización) WebConfigurationManager.GetSection ("system.web/authorization", Request.Path); Request.Path navega a location = "RestrictedPage.aspx" (cuando es la página actual). Gracias! –

+0

Para obtener el web.config actual, para la variable configPath, reemplácela o establézcala en "~" como se describe en esta respuesta [aquí] (http://stackoverflow.com/a/4134213/603807) – dyslexicanaboko

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

¿Eso es lo que estás pidiendo?

0

No estoy seguro, pero pensé que esto se verifica antes incluso de que su página se procese, por lo que si un usuario no tiene un rol, nunca llegaría a su página. Lo que finalmente haría que la visibilidad de esto sea redundante en la página.

+1

Pero si el usuario está en una de las funciones autorizadas, es posible que desee saber en qué función se encuentran, ¿verdad? – DOK

0

Estoy convencido de que hay una mejor manera de leer esta información, pero aquí hay una manera de que usted pueda 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 funciones ASP.NET se encargará de esto para usted, por lo que la lectura de estos valores sólo es realmente relevante si va a hacer algo con ellos en el código subyacente al lado de los usuarios implicados, que se puede estar haciendo.

Espero que esto ayude, es posible que tenga que dividir el resultado con el carácter.

0

Lo que normalmente sucede es lo siguiente ...

Cuando el usuario llega a su página, si la autenticación/autorización está activo, se provoca el evento Application_Authentication. A menos que use la Autenticación de Windows con algo similar a Active Directory, los objetos IPrincipal e Identity no estarán disponibles para usted, por lo que no podrá acceder al método User.IsInRole(). Sin embargo, puede hacerlo añadiendo el siguiente código en el 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 pondrá una galleta en la sesión del navegador con las credenciales de usuarios y roles adecuados se puede acceder desde la aplicación web.

Idealmente, su usuario solo tendrá una función en una aplicación, por lo que creo que es por eso que tiene el método de verificación de roles disponible para usted. Sería bastante fácil de escribir un método de ayuda para usted que recorrer la lista de roles en la aplicación y prueba para ver cuál es el papel que se encuentran.

Cuestiones relacionadas