4

このスレッドをフォローアップすると、これが私が思いついたものです...

public class SharweAuthorizeAttribute : AuthorizeAttribute
{
    private bool isAuthenticated = false;
    private bool isAuthorized = false;
    public new string[] Roles { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true)
        {
            isAuthenticated = true;
            foreach (string role in Roles)
            {
                if (RolesService.HasRole((string)role))
                    isAuthorized = true;
            }
        }
        return (isAuthenticated && isAuthorized);
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!isAuthenticated)
        {
            filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary 
                            {
                                { "action", "User" },
                                { "controller", "Login" }
                            });
        } else if(!isAuthorized) {
            filterContext.Result = new RedirectToRouteResult(
                            new RouteValueDictionary 
                            {
                                { "action", "Home" },
                                { "controller", "Error" }
                            });
        }
    }
}

どのように/なぜ私はこれを思いついたのですか? AuthorizeAttribute ワークフローは次のようになると思います。

  1. まず、AuthorizeCore がトリガーされます。true が返された場合、ユーザーは承認されています。false を返す場合、HandleUnauthorizedRequest がトリガーされます。そうですか?
  2. newプロパティをオーバーライドするにはキーワードを使用する必要があることをどこかで読みました。したがって、これが私が Roles プロパティをオーバーライドした方法です。しかし、オーバーライドするプロパティが最初のプロパティ (基底クラスのもの) とは異なるタイプだった場合、それもそれを隠したり、まったく別のプロパティを作成したりしますか?

それで、あなたはどう思いますか?それは実際に機能するはずですか?UI をセットアップしていないため (デザイナーがデザインを完成させるのを待っているため)、今はテストできません... 実際、TDD の利点を理解するのはこれが初めてです。愚かで役に立たないが、私は間違っていた:)

PS:このスレッドでは、@tvanfosson がコンテキストの CachePolicy を設定しています (私はそう思います)。

前もって感謝します。

4

1 に答える 1

2
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    private readonly bool _authorize;
    private readonly string[] _roles;

    public CustomAuthorizeAttribute(string roles)
    {
        _authorize = true;
        _roles = roles.Split(',');
    }

    public CustomAuthorizeAttribute(string roles, bool isAdminPath)
    {
        _authorize = true;
        _roles = roles.Split(',');
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //if controller have role auth and user is not loged
        if(_authorize && !httpContext.User.Identity.IsAuthenticated)
            return false;

        // if controller have role auth and user is loged
        if(_roles != null)
        {
            //grab user roles from DB
            var UserRole = RoleRepository.GetUserRole(new Guid(httpContext.User.Identity.Name));
            if (_roles.Contains(UserRole))
               return true;
        }
        return false;
    }
}

コントローラー内

[CustomAuthorize("Administrator,Company,OtherRole")]
public ActionResult Test(){
    return View();
}
于 2012-11-16T15:17:18.220 に答える