3

asp.net (3.5) アプリケーションでフォーム認証を使用しています。また、ロールを使用して、どのユーザーがアプリのどのサブディレクトリにアクセスできるかを定義しています。したがって、私の web.config ファイルの関連セクションは次のようになります。

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="Default.aspx" path="/" protection="All" timeout="360" name="MyAppName" cookieless="UseCookies"  />      
  </authentication>
  <authorization >
    <allow users="*"/>
  </authorization>
</system.web>

<location path="Admin">
  <system.web>
    <authorization>
      <allow roles="Admin"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>

私が読んだことに基づいて、これにより、管理者ディレクトリにアクセスできる唯一のユーザーは、認証されて管理者ロールが割り当てられたユーザーになることが保証されます。

ユーザー認証、認証チケットの保存、およびその他の関連する問題はすべて正常に機能します。タグを web.config ファイルから削除すると、すべて正常に動作します。問題は、管理者の役割を持つユーザーのみが管理者ディレクトリにアクセスできるように強制しようとしたときに発生します。

このMS KB 記事と同じ情報を提供する他の Web ページに基づいて、次のコードを Global.asax ファイルに追加しました。

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
    if (HttpContext.Current.User != null) {
        if (Request.IsAuthenticated == true) {    
            // Debug#1            
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies[FormsAuthentication.FormsCookieName].Value);
            // In this case, ticket.UserData = "Admin"                
            string[] roles = new string[1] { ticket.UserData }; 
            FormsIdentity id = new FormsIdentity(ticket);
            Context.User = new System.Security.Principal.GenericPrincipal(id, roles);
            // Debug#2
        }
    }
}

ただし、ログインしようとすると、Admin フォルダーにアクセスできません (ログイン ページにリダイレクトされます)。

問題をデバッグしようとして、リクエストをステップ実行すると、上記の Debug#1 とマークされた行で Context.User.IsInRole("Admin") を実行すると、false が返されます。行 Debug#2 で同じステートメントを実行すると、true になります。したがって、少なくとも Global.asax に関する限り、Role は適切に割り当てられています。

Global.asax の後、実行はログイン ページに直接ジャンプします (役割がないため、admin フォルダー内のページの読み込みが拒否されるため)。ただし、ログインの Page_Load の最初の行で同じステートメントを実行すると、false が返されます。そのため、Global.asax の Application_AuthenticateRequest と制限されたディレクトリの WebForm の初期ロードの後のどこかで、ロール情報が失われ、認証が失敗します (注: Page_Load では、適切な認証チケットがまだ Context.User.Id に割り当てられています)。 - 役割だけが失われています)。

私は何を間違っていますか、どうすれば正しく動作させることができますか?


更新:以下のソリューションを入力しました

4

2 に答える 2

5

問題と解決策は次のとおりです。

開発の早い段階で、私は Web サイト メニューに移動し、Asp.net 構成をクリックしました。これにより、次の行が web.config に追加されました。

<system.web>
  <roleManager enabled="true" />
</system.web>

その時点から、アプリは、FormsAuthentication ロールではなく、Asp.net サイト マネージャーを介してロールを実行していると想定していました。したがって、実際の認証とロールのロジックが正しく設定されていたにもかかわらず、失敗が繰り返されました。

この行が web.config から削除された後、すべてが完全に機能しました。

于 2008-09-11T16:23:11.433 に答える
0

これはただのランダム ショットですが、管理者の権限の順序が原因でブロックされていますか? たぶん、すべてを拒否し、すべての管理者を切り替えてみてください。

拒否によって上書きされた場合に備えて。

(ここにコード サンプルがありましたが、表示されませんでした。

于 2008-09-11T13:18:13.607 に答える