Nella mia classe codebehind, come posso recuperare i ruoli autorizzati?
-
03-07-2019 - |
Domanda
Ho il seguente nel mio web.config:
<location path="RestrictedPage.aspx">
<system.web>
<authorization>
<allow roles="Group1Admin, Group3Admin, Group7Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
In RestrictedPage.aspx.cs, come posso recuperare la raccolta di ruoli consentiti che contiene Group1Admin, Group3Admin e Group7Admin?
Ecco perché chiedo:
web.config sta gestendo l'autorizzazione per la pagina. Funziona benissimo. Ma avrò un paio di queste pagine (ad esempio RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Ognuna di queste pagine avrà il mio controllo web personalizzato su di esso. E ognuna di queste pagine avrà ruoli consentiti diversi. Il mio webcontrol ha un elenco a discesa. Le scelte all'interno del menu a discesa dipendono dall'intersezione dei ruoli dell'utente e dai ruoli consentiti della pagina.
Come menzionato di seguito, la ricerca nel web.config con XPath probabilmente funzionerebbe. Speravo solo qualcosa di più quadro. Un po 'come SiteMap. Quando inserisco i ruoli nella mia web.sitemap, posso acquisirli usando SiteMap.CurrentNode.Roles (il mio sito web utilizza l'autenticazione di Windows, quindi non posso usare web.sitemap per il taglio di sicurezza e preferirei mantenere i ruoli in uno solo file).
Soluzione
// 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");
dall'oggetto sezione ottenere l'oggetto AuthorizationRuleCollection dove è quindi possibile estrarre i ruoli.
Nota: probabilmente dovrai modificare un po 'il percorso della sezione poiché inizi con " location path = " RestrictedPage.aspx " " ;, non ho provato quello scenario.
Altri suggerimenti
if {User.IsInRole("Group1Admin"){//do stuff}
È quello che stai chiedendo?
Non ne sono sicuro, ma avrei pensato che questo fosse verificato prima che la tua pagina fosse persino elaborata, quindi se un utente non avesse un ruolo non avrebbe mai raggiunto la tua pagina. Che alla fine renderebbe ridondante la visibilità di questo nella pagina.
Sono convinto che esiste un modo migliore per leggere queste informazioni, ma qui è un modo per leggere i valori consentiti da un file 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);
}
Naturalmente, il provider di ruoli ASP.NET lo gestirà per te, quindi la lettura di questi valori è davvero rilevante solo se hai intenzione di fare qualcosa con loro nel code-behind accanto all'autorizzazione degli utenti, cosa che potresti fare.
Spero che questo ti aiuti - potresti dover dividere il risultato usando il carattere,.
Ciò che accade in genere è questo ...
Quando l'utente accede alla tua pagina, se l'autenticazione / autorizzazione è attiva, viene generato l'evento Application_Authentication. A meno che non si utilizzi l'autenticazione di Windows su qualcosa come Active Directory, gli oggetti IPrincipal e Identity non saranno disponibili, quindi non è possibile accedere al metodo User.IsInRole (). Tuttavia, puoi farlo aggiungendo il seguente codice nel tuo file 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
Ciò inserirà un cookie nella sessione del browser con le credenziali utente e ruolo appropriate a cui è possibile accedere nell'app Web.
Idealmente, il tuo utente avrà solo un ruolo in un'applicazione, quindi credo sia per questo che hai a disposizione il metodo di controllo del ruolo. Sarebbe abbastanza facile scrivere un metodo di supporto per te che verifichi l'elenco dei ruoli nell'applicazione e provi per vedere in quale ruolo ricoprono.