4

MVC4アプリで詳細な承認を処理するために作成されたカスタムAuthorizeAttributeクラスがあります。

これはクラスです:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class isAuthorized : AuthorizeAttribute
{
    public oRoles enRole;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        string test = enRole.ToString();
        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;

        bool bFlag = AuthCheck.CheckUser(httpContext, enRole);
        if (bFlag) // I know this is a lot of code; it's for debugging purposes
            return true;

        return false;
    }
}

コード支援を可能にするために、次の列挙型が宣言されています。

public enum oRoles
{
    StudentSelfPassword = 1,
    StaffSelfPassword = 2,
    StudentLookup = 3,
    StudentChangeRequest = 4,
    StudentAdmin = 5,
    StaffLookup = 6,
    StaffChangeRequest = 7,
    StaffAdmin = 8,
    ChangeQueueApproval = 9
}

私のコントローラーでは、次の方法でAuthorizeAttributeを呼び出します。

    [isAuthorized(enRole = oRoles.StudentLookup)]
    [isAuthorized(enRole = oRoles.StaffLookup)]
    [isAuthorized(enRole = oRoles.StudentChangeRequest)]
    [isAuthorized(enRole = oRoles.StaffChangeRequest)]

デバッガーで実行すると、最初のisAuthorizedが実行されてtrueを返し(必要に応じて)、2番目のisAuthorizedに進み、falseを返し、すぐに認証を求められます。最初の条件が真だったので、私はそれが許されることを期待していました。しかし、私の仮定は正しくなかったようです。

元々、ドメイン内のグループであるRoles = "change、admin"があり、それは機能しましたが、グループは静的ではなく動的に割り当てる必要がありました。そこに複数のアイテムをプッシュすることができました。文字列として送信されていたからですか?

基本的にisAuthorized(...)を実行する方法はありますか|| isAuthorized(...)|| isAuthorized(...)1つの条件が真の場合、それはokとして検証されますか?

4

1 に答える 1

9

属性に、単一のoRoleを持つプロパティを含めるのではなく、ロールのリストまたは配列を含めることができます。また、多数の属性を配置するのではなく、1つの属性でメソッドを装飾し、許可された役割の配列を渡します。

[isAuthorized(enRoles = new oRoles[]{oRoles.StudentLookup, oRoles.StaffLookup })]

複数の値を取る属性を作成する例はここにあります

次に、認証チェックコードで、提供されているすべての許可リストと照合できます。以下のコードのようなもの

 bool bFlag = enRoles.ToList().Any( r => AuthCheck.CheckUser(httpContext, r));
于 2013-03-16T01:54:10.007 に答える