В моем классе codebehind как получить авторизованные роли? - PullRequest
6 голосов
/ 18 октября 2008

В моем web.config есть следующее:

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

В RestrictedPage.aspx.cs как получить коллекцию разрешенных ролей, которая содержит Group1Admin, Group3Admin и Group7Admin?

Вот почему я спрашиваю:

web.config обрабатывает авторизацию на странице. Это отлично работает. Но у меня будет несколько таких страниц (например, RestrictedPage.aspx, RestrictedPage2.aspx, RestrictedPage3.aspx). На каждой из этих страниц будет мой пользовательский веб-контроль. И каждая из этих страниц будет иметь разные разрешенные роли. Мой веб-контроль имеет выпадающий список. Выбор в раскрывающемся списке зависит от пересечения ролей пользователя и разрешенных ролей страницы.

Как упомянуто ниже, поиск web.config с XPath, вероятно, будет работать. Я просто надеялся на что-то более каркасное. Вроде как SiteMap. Когда я помещаю роли в свой файл web.sitemap, я могу получить их, используя SiteMap.CurrentNode.Roles (мой веб-сайт использует проверку подлинности Windows, поэтому я не могу использовать web.sitemap для усечения безопасности, и я предпочел бы поддерживать роли только в одном файл).

Ответы [ 5 ]

3 голосов
/ 18 октября 2008
// 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");

из объекта section получите объект AuthorizationRuleCollection, где вы можете затем извлечь роли.

Примечание: вам, вероятно, потребуется немного изменить путь к разделу, поскольку вы начинаете с "location path =" RestrictedPage.aspx "", я не пробовал этот сценарий.

0 голосов
/ 18 октября 2008

Что обычно происходит, это ...

Когда пользователь заходит на вашу страницу, если аутентификация / авторизация активна, возникает событие Application_Authentication. Если вы не используете проверку подлинности Windows для чего-то вроде Active Directory, объекты IPrincipal и Identity не будут вам доступны, поэтому вы не сможете получить доступ к методу User.IsInRole (). Однако вы МОЖЕТЕ сделать это, добавив следующий код в файл 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

При этом в сеанс браузера будет добавлен файл cookie с надлежащими учетными данными пользователя и роли, доступ к которым можно получить в веб-приложении.

В идеале, ваш пользователь будет играть только одну роль в приложении, поэтому я считаю, что именно поэтому у вас есть доступный метод проверки роли. Было бы достаточно легко написать вспомогательный метод для вас, который будет перебирать список ролей в приложении и проверять, в какой роли они находятся.

0 голосов
/ 18 октября 2008

Я не уверен наверняка, но я бы подумал, что это проверяется еще до того, как ваша страница обработана, поэтому, если пользователь не в роли, он никогда не достигнет вашей страницы. Что в конечном итоге сделает видимость этого излишним на странице.

0 голосов
/ 18 октября 2008

Я убежден, что есть лучший способ прочитать эту информацию, но вот способ, которым вы можете прочитать разрешающие значения из файла 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); 
} 

Конечно, поставщик ролей ASP.NET справится с этим для вас, поэтому чтение этих значений действительно важно, только если вы планируете что-то с ними делать в коде позади авторизующих пользователей, что вы, возможно, делаете. 1004 *

Надеюсь, это поможет - вам, возможно, придется разделить ваш результат, используя символ,.

0 голосов
/ 18 октября 2008
if {User.IsInRole("Group1Admin"){//do stuff}

Это то, что вы просите?

...