1

私のMVC3wepアプリでは、以下のようにAuthorize属性を拡張しました

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (Authenticate.IsAuthenticated() && httpContext.User.Identity.IsAuthenticated)
        {
            var authCookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                var ticket = FormsAuthentication.Decrypt(authCookie.Value);
                var roles = ticket.UserData.Split('|');
                var identity = new GenericIdentity(ticket.Name);
                httpContext.User = new GenericPrincipal(identity, roles);
            }
        }
        return base.AuthorizeCore(httpContext);
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {

        if (!Authenticate.IsAuthenticated())
            HandleUnauthorizedRequest(filterContext);


        base.OnAuthorization(filterContext);

    }

私のアクションでは、私はそれを次のように使用します

    [MyAuthorize(Roles = "Member,Inspector,SalesRep,Admin,SuperAdmin")]
    public ActionResult OrderUpload()

ここで、すべてのアクションで各ユーザーロールを指定する必要があります。私がやりたいのは、以下のようなものを指定することです

    [MyAuthorize(Roles = "Member")]
    public ActionResult OrderUpload()

これにより、「メンバー」以上のすべてのユーザーロールが許可されます。したがって、「SalesRep」は許可する必要がありますが、「Member」の下にいる「Visitor」は許可しないでください。

すべてのユーザーロールは、数が増えるにつれて列挙型になります

public enum UserAccountType
{
    Visitor = 5,
    Member = 10,
    Inspector = 15,
    SalesRep = 20,
    Admin = 25,
    SuperAdmin = 30
}

これを機能させるためにMyAuthorizeAttributeを変更するにはどうすればよいですか?

ありがとう

4

2 に答える 2

1

私はAuthorizeAttributeを使用しませんがActionFilterを使用します(それは私だけであり、それが私がそれを学んだ方法です)が、私がすることは、アクションの前に属性がトリガーされたときに更新されるAuthorizeAttributeにプロパティを追加することです。

public class MyAuthorizeAttribute : AuthorizeAttribute
{
    private string Role = "";

    public MyAuthorizeAttribute(string role){
        this.Role = role;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
          :
          :
          :
          // now do a check if the Role is authorized or not using your enum. 
          // return error page if not
          if(RoleisAuthorized)
            return; 
          else
            // error page

    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
          :
          :
          :
    }
}

ロールを取得したら、列挙型から取得し、ロールがページへのアクセスを許可されているかどうかを比較します。許可されていない場合は、エラーページを返します。したがって、私はOnAuthorizationに精通していないため、プロセスをAuthorizeCore内に配置します。

于 2012-11-30T21:53:30.240 に答える