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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top