6

私は現在 Admin MVC 3 サイトを作成しており、各ユーザーはサイトの特定の部分にしかアクセスできません。

私のサイトの領域はユーザーの役割と同じなので、役割のパラメーターとして領域の名前を使用して、各領域に AuthorizeAttribute を配置したいと考えています。

これまでのところ、各領域のチェックをハードコーディングしているときにこれが機能するようになりましたが、すべての領域をループして Authorize フィルターを適用したいと思います。(私はこれをカスタム FilterProvider として使用しています - http://www.dotnetcurry.com/ShowArticle.aspx?ID=578 )

これまでの私のコード(「Gcm」は私の分野の1つであり、役割でもあります):

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    // for all controllers, run AdminAuthorizeAttribute to make sure they're at least logged in
    filters.Add(ObjectFactory.GetInstance<AdminAuthorizeAttribute>());

    AdminAuthorizeAttribute gcmAuthroizeAttribute = ObjectFactory.GetInstance<AdminAuthorizeAttribute>();
    gcmAuthroizeAttribute.Roles = "Gcm";

    var provider = new FilterProvider();
    provider.Add(
        x =>
        x.RouteData.DataTokens["area"] != null && x.RouteData.DataTokens["area"].ToString() == "Gcm"
            ? gcmAuthroizeAttribute
            : null);
    FilterProviders.Providers.Add(provider);
}

アプリケーションのすべての領域を取得する方法を知っている人はいますか?

または、誰かがエリアごとに承認する方法についてより良いアイデアを持っている場合は、それをいただければ幸いです。

助けてくれてありがとう

4

3 に答える 3

2

エリアごとに基本コントローラーを作成し、基本クラスに authorize 属性を配置できます。そうすれば、各エリアのベース コントローラーにエリア パラメーターを渡すことができます。

于 2011-06-30T22:10:23.253 に答える
-1

別の問題を調査していたときに、How to pass parameters to a custom ActionFilter in ASP.NET MVC 2? に遭遇しました。

この属性の例を変更して、現在のコントローラーの領域を確認できます。

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        RouteData routeData = filterContext.RouteData;

        // check if user is allowed on this page
        if (SessionFactory.GetSession().Contains(SessionKey.User))
        {
            User user = (User)SessionFactory.GetSession().Get(SessionKey.User);
            string thisArea = routeData.DataTokens["area"].ToString();

            // if the user doesn't have access to this area
            if (!user.IsInRole(thisArea))
            {
                HandleUnauthorizedRequest(filterContext);
            }
        }

        // do normal OnAuthorization checks too
        base.OnAuthorization(filterContext);
    }
}

次に、Global.asax で次のように、カスタムの承認属性をすべてのコントローラーに適用します。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    // for all controllers, run CustomAuthorizeAttribute to make sure they're at logged in and have access to area
    filters.Add(ObjectFactory.GetInstance<CustomAuthorizeAttribute>());
}

返信してくれたすべての人に感謝します

サーン

于 2011-09-14T12:33:57.350 に答える