分離コードクラスで、許可されたロールを取得するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/213784

  •  03-07-2019
  •  | 
  •  

質問

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

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

役に立ちましたか?

解決

// 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オブジェクトを取得し、そこでロールを抽出できます。

注:&quot; location path =&quot; RestrictedPage.aspx&quot;&quot;で始まるので、おそらくセクションへのパスを少し変更する必要があるでしょう。私はそのシナリオを試しませんでした。

他のヒント

if {User.IsInRole("Group1Admin"){//do stuff}

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

確かではありませんが、これはあなたのページが処理される前にチェックされると思っていたので、ユーザーがロールを持たない場合、彼らはあなたのページに到達しません。これにより、最終的にページ内のこの可視性が冗長になります。

この情報を読むにはもっと良い方法があると確信していますが、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ロールプロバイダーがこれを処理します。したがって、これらの値の読み取りは、ユーザーの承認の横にあるコードビハインドで値を使用する場合にのみ関連します。 / p>

これが役立つことを期待してください-文字を使用して結果を分割する必要があるかもしれません。

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

ユーザーがページにアクセスすると、認証/承認がアクティブな場合、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つのロールにしかならないため、ロールチェックメソッドを使用できるのはそのためです。アプリケーションのロールのリストを反復処理し、それらがどのロールに属しているかをテストするヘルパーメソッドを記述するのは簡単です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top