En mi clase de código, ¿cómo recupero los roles autorizados?
-
03-07-2019 - |
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).
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.