6

私の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 コントロールが配置されます。そして、これらの各ページには、許可される役割が異なります。私の Web コントロールにはドロップダウン リストがあります。ドロップダウン内の選択肢は、ユーザーの役割とページの許可された役割の交差によって異なります。

以下で説明するように、XPath を使用して web.config を検索すると、おそらくうまくいくでしょう。もっとフレームワーク的なものを望んでいました。サイトマップのようなもの。web.sitemap にロールを配置すると、SiteMap.CurrentNode.Roles を使用してそれらを取得できます (私の Web サイトは Windows 認証を使用しているため、セキュリティ トリミングに web.sitemap を使用できず、ロールを 1 つのみに維持したいと考えています)。ファイル)。

4

5 に答える 5

3
// 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");

セクション オブジェクトから AuthorizationRuleCollection オブジェクトを取得し、そこでロールを抽出できます。

注: 「location path="RestrictedPage.aspx"」で開始するため、セクションへのパスを少し変更する必要があるかもしれませんが、そのシナリオは試していません。

于 2008-10-18T00:27:24.850 に答える
0

通常起こることはこれです...

ユーザーがページにアクセスしたときに、認証/承認がアクティブな場合、Application_Authenticationイベントが発生します。Active Directoryなどに対してWindows認証を使用していない限り、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

これにより、Webアプリでアクセスできる適切なユーザーとロールのクレデンシャルを使用してCookieがブラウザーセッションに配置されます。

理想的には、ユーザーはアプリケーションで1つの役割しか持たないので、役割チェック方法を利用できるのはそのためだと思います。アプリケーション内の役割のリストを反復処理し、それらがどの役割にあるかをテストするヘルパーメソッドを作成するのは簡単です。

于 2008-10-17T21:58:06.447 に答える
0
if {User.IsInRole("Group1Admin"){//do stuff}

それはあなたの質問ですか?

于 2008-10-17T20:53:05.563 に答える
0

確かではありませんが、ページが処理される前にこれがチェックされると思っていたので、ユーザーが役割を持っていない場合、ページにアクセスすることはありません。これにより、最終的にページ内でこれが冗長に表示されるようになります。

于 2008-10-17T20:57:31.733 に答える
0

この情報を読み取るためのより良い方法があると確信していますが、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 ロール プロバイダーがこれを処理します。そのため、これらの値の読み取りは、ユーザーの承認以外にコード ビハインドで何かを行う予定がある場合にのみ関連します。

これが役立つことを願っています-文字を使用して結果を分割する必要がある場合があります。

于 2008-10-17T21:05:28.487 に答える