0

動的ロール割り当て用に次のカスタマイズ クラスがあります。

 public class DynamicAuthorizeAttribute : AuthorizeAttribute
    {
        IVRControlPanelRepository repository = new IVRControlPanelRepository();
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            var controllerName = httpContext.Request.RequestContext.RouteData.Values["controller"];
            var actionName = httpContext.Request.RequestContext.RouteData.Values["action"];
            string controller = controllerName.ToString() + "Controller";
            string action = actionName.ToString();    
            repository.GetAssignRole(controller, action);    
            GetRolesFromDatabase(controllerName, actionName);
             //  Roles = "Role1,Role2,Role3"; 
            Roles = repository.GetAssignRole(controller, action);    
            return base.AuthorizeCore(httpContext);
        }
    }

以下は、コンマで区切られたロールの文字列を返す関数です

public string GetAssignRole(string controllername, string actionname)
        {
            using (AppEntities db = new AppEntities())
            {
                var result = from u in db.AssignRoles where (u.ControllerName == controllername && u.ActionName == actionname) select u;                    
                if (result.Count() != 0)
                {
                    var rol = result.FirstOrDefault();    
                    return rol.Role;
                }
                else
                {
                    return "";
                }                    
            }      
        }

[DynamicAuthorizeAttribute]すべてのコントローラーのすべてのアクションに属性を配置しました。

問題:

GetAssignRole() から返された Roles が空の場合、LogOn にリダイレクトされます。Roles=""しかし、実際には、上記のコードの場合、アクションへの不正アクセスとして割り当てたいと考えています。Roles="Administrator,Member" の場合、ロールが GetAssignRole() から返された空の文字列である場合、匿名ユーザーまたは任意のユーザーによるアクションにアクセスするために、上記の関数で変更する必要があるものは適切に機能します。

4

2 に答える 2

4

まあ、私が知る限り、それを行ういくつかの機会があります

まず、OnAuthorizationをオーバーライドして、ここでRolesプロパティを埋めることができます。その後、役割の数を確認し、AuthorizeCoreを呼び出すか、単に戻るかを決定します(この場合、戦術AuthorizeAttributeの開発者をコピーします)

次に、AllowAnonymous属性を使用します

第三に、デフォルトの役割として、すべてのユーザーに対して独自の匿名の役割を作成します

于 2012-12-12T10:39:40.403 に答える
1

私が正しく理解した場合、あなたは必要です:

...
Roles = repository.GetAssignRole(controller, action);    
if (Roles.Length == 0) return true;
return base.AuthorizeCore(httpContext);
于 2012-12-12T10:25:32.500 に答える