1

通常、権限設定を使用してロールと対話します。

<location path="Register.aspx">
  <system.web>
    <authorization>
      <allow roles="Administrator"/>
      <deny users="?"/>
    </authorization>
  </system.web>
</location>

しかし、テーブル内のデータベースにこの設定をしたいと思います

tblAuthorization
-IdAuthorization (Identy(1,1))
-IdCompany=5
-IdRol=5 (Administrator”)
-Path=”Register.aspx”

これを行うクラスの設定はありますか?Profile、RoleProviderのようなものがあります..

<roleManager enabled="true"  defaultProvider="MyAccessRolProvider">
   <providers>
      <clear />
      <add name="MyAccessRolProvider" type="MyAccessRolProvider" connectionStringName="MyConnectionString" applicationName="/" />
      <add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/" />
   </providers>
</roleManager>

今のところ、Page_Load イベントで検証を実装できると思うのはそれだけです。無効な場合はリダイレクトを作成しますが、もう少し「プロフェッショナル」にします。

protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
   {
      if(!ValidateAuthorization())
      {
          Response.Redirect("Login.aspx");
      }
   }
}

例を教えてください。

事前にどうもありがとうございました

4

3 に答える 3

1

最善の策は、カスタム RoleProvider を実装することです。質問にカスタム RoleProvider (MyAccessRolProvider) を含む構成セクションが含まれているため、この方向に向かっているようです。

RoleProvider の完全修飾名を指定する必要がありますMyNamespace.MyAccessRoleProvider, MyAssembly

MSDN では、サンプル実装を含め、これを行う方法について説明しています

于 2012-11-08T18:44:16.333 に答える
0

私が知る限り、これに対するすぐに使えるサポートはありませんが、次のように実装することをお勧めします。

AuthorizeAttribute から派生する新しいクラスを作成し、ID プロパティを追加して、"AuthorizeCore" メソッドをオーバーライドします。

  public class CustomAutorizeAttribute : AuthorizeAttribute
        {
            public Guid ActionId { get; set; }

            protected override bool AuthorizeCore(HttpContextBase httpContext)
            {
                //Check user has access to action with ID = ActionId
                //implementation omitted
            }
        }

アクションとそれに関連付けられた ID 値を保持する新しいデータベース テーブルを追加できます。レコードをテーブルに手動で追加するか、リフレクションを使用してこれを行うコードを記述できます (かなりの数のアクションがあり、将来さらに追加する可能性がある場合は、これをお勧めします)。

これが完了したら、これらのアクションへのアクセス権をユーザーまたはアプリケーション ロールに割り当てることができます。

カスタム Authorize 属性では、ユーザーが AuthorizeCore メソッドから true または false を返す特定のアクションにアクセスできるかどうかを確認する必要があります。

ユーザーがログインしたときにユーザーがアクセスできるすべてのアクションのコレクションを取得し、それらをサーバーキャッシュまたは何らかの分散キャッシュに保存して、すべてのリクエストでデータベースにヒットしないようにすることをお勧めします。

更新 - 申し訳ありませんが、MVC ではなく ASP.NET フォームを使用していることに気付きました。私のアプローチはMVCアプリケーションのためのものなので、おそらく関連性はありませんが、MVC開発者があなたの質問に出くわした場合に備えてここに残します.

于 2012-11-08T16:56:12.247 に答える
0

ページ レベルでの承認について理解している場合は、HTTP モジュール ( IHttpModule ) を追加し、モジュールを使用して承認チェックを行うことができます。認証が失敗した場合は、必要に応じてリダイレクトできます。

このようなものがうまくいくかもしれません:

public class MyAuthorizationModule : IHttpModule
{

    public void Init(HttpApplication application)
    {
        application.AuthorizeRequest += (new EventHandler(AuthorizeRequest));
    }

    private void AuthorizeRequest(Object source, EventArgs e)
    {
        bool isAuthorized = //your code here to check page authorization

        if (!isAuthorized) 
        {  
            var response = //will need to get current response
            response.Redirect("Login.aspx", true);
        }
    }
}

注: モジュールを Web アプリケーションに追加する必要があることを忘れないでください。

于 2012-11-08T17:13:34.753 に答える