Na minha classe codebehind, como faço para recuperar os papéis autorizados?
-
03-07-2019 - |
Pergunta
Eu tenho o seguinte no meu web.config:
<location path="RestrictedPage.aspx">
<system.web>
<authorization>
<allow roles="Group1Admin, Group3Admin, Group7Admin"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Dentro RestrictedPage.aspx.cs, como faço para recuperar a coleção papéis permitiu que contém Group1Admin, Group3Admin e Group7Admin?
Aqui está o porquê eu pergunto:
O web.config está a lidar com a autorização para a página. Esta coima funciona. Mas eu vou ter um par destas páginas (dizem RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). Cada uma dessas páginas vai ter o meu WebControl personalizado nele. E cada uma dessas páginas terão diferentes papéis permitidos. Meu WebControl tem uma lista suspensa. As escolhas dentro da lista suspensa dependem da interseção de funções do usuário e os papéis autorizados da página.
Como mencionado abaixo, procurando o web.config com XPath provavelmente funcionaria. Eu só estava esperando por algo mais quadro-y. Tipo como mapa do site. Quando eu colocar papéis no meu web.sitemap, posso agarrá-los usando SiteMap.CurrentNode.Roles (meu site está usando a autenticação do Windows, então não posso usar web.sitemap para filtragem de segurança e eu prefiro manter papéis em apenas um arquivo).
Solução
// 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");
a partir do objeto de seção obter o objeto AuthorizationRuleCollection onde você pode, em seguida, extrair os Roles.
Nota:. Você provavelmente vai precisar modificar o caminho para a seção um pouco desde que você comece com "caminho do local =" RestrictedPage.aspx "" eu não tentar esse cenário
Outras dicas
if {User.IsInRole("Group1Admin"){//do stuff}
É isso que a sua pergunta?
Eu não tenho certeza com certeza, mas eu teria pensado que este é verificado antes de sua página é ainda processado, por isso, se um usuário não está em um papel que nunca alcançaria sua página. Que finalmente faria a visibilidade deste redundante na página.
Estou convencido de que há uma maneira melhor de ler esta informação, mas aqui é uma maneira que você pode ler a valores permitem a partir de um arquivo 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);
}
Claro, o provedor de função ASP.NET irá lidar com isso para você, então a leitura destes valores só é realmente relevante se você pretende fazer algo com eles no código-behind lado autorizando os usuários, que você pode estar fazendo.
Espero que isso ajude - você pode ter que dividir o seu resultado usando o, caráter.
O que normalmente acontece é o seguinte ...
Quando o usuário acessa sua página, se a autenticação / autorização está ativo, o evento Application_Authentication é levantada. A menos que você estiver usando autenticação do Windows contra algo como Active Directory, os objetos IPrincipal e identidade não estará disponível para você, então você não pode acessar o método User.IsInRole (). No entanto, você pode fazer isso adicionando o código a seguir em seu arquivo global:
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
Isto irá colocar um cookie na sessão do navegador com as credenciais do usuário e papel apropriado que você pode acessar no aplicativo web.
O ideal é que o usuário só vai estar em um papel em um aplicativo, então eu acredito que é porque você tem o método de verificação de papel disponível para você. Seria fácil o suficiente para escrever um método auxiliar para você que iria percorrer a lista de funções na aplicação e teste para ver qual o papel que eles estão em.