【问题标题】:Customize Authorize Filter attribute parameter自定义授权过滤器属性参数
【发布时间】:2013-07-07 06:35:03
【问题描述】:

我有以下要求来实现访问控制列表

public class SecurityObject{
public string Key{get;set;}
public string DisplayName{get;set;}
public bool isAllowed{get;set;}
}

public class Role{
List<SecurityObject> AccessibleObjects{get;set;}
}

目前我使用表单身份验证进行基本授权。下面是我的代码

Global.asax.cs

 public class MvcApplication : System.Web.HttpApplication
 {
    public override void Init()
    {
        this.PostAuthenticateRequest += new 
                           EventHandler(MvcApplication_PostAuthenticateRequest);

        base.Init();
    }
    void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
    {
      HttpCookie authCookie =
       HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie != null)
        {
            string encTicket = authCookie.Value;
            if (!String.IsNullOrEmpty(encTicket))
            {
                FormsAuthenticationTicket ticket = 
                                 FormsAuthentication.Decrypt(encTicket);

                string[] userData = ticket.UserData.Split(new string[] { "___" },
                                 StringSplitOptions.None);
                string[] roles = null;
                if (userData.Length > 1)
                {
                    roles = userData[1].Split(',');
                }
            MyCustomIdentity identity = new MyCustomIdentity(ticket);
            GenericPrincipal principle = new GenericPrincipal(identity, roles);
            HttpContext.Current.User = principle;
            }
        }
    }}

我当前的控制器类

public class AdminController : Controller
 {
  [HttpPost, Authorize, ValidateAntiForgeryToken]
    public ActionResult SaveUser(UserDetailViewModel viewModel)
    {

    }
  }

我的目标控制器类

public class AdminController : Controller
 {
  [HttpPost, Authorize(ACLKey="USR_SAVE"), ValidateAntiForgeryToken]
    public ActionResult SaveUser(UserDetailViewModel viewModel)
    {

    }
  }

我希望我的操作方法使用 ACLKey 进行修饰,并且我想检查用户角色是否具有给定的键,并基于此我需要执行或返回 HttpUnauthorizedResult 页面,即使对于来自 jQuery 的 Ajax 请求也是如此。

我提到了很多像Customizing authorization in ASP.NET MVC 这样的方法,但我没有找到一种方法来执行表单身份验证和我的自定义 ACLKey 检查。

如何解析值USR_SAVE 并使用 CustomAuthorizeFilter 处理自定义身份验证?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4


    【解决方案1】:

    你可以这样试试

    public class FeatureAuthenticationAttribute : FilterAttribute, IAuthorizationFilter
    {
        public string AllowFeature { get; set; }
    
        public void OnAuthorization(AuthorizationContext filterContext)
        {
    
            var filterAttribute = filterContext.ActionDescriptor.GetFilterAttributes(true)
                                    .Where(a => a.GetType() == 
                                   typeof(FeatureAuthenticationAttribute));
            if (filterAttribute != null)
            {
                foreach (FeatureAuthenticationAttribute attr in filterAttribute)
                {
                    AllowFeature = attr.AllowFeature;
                }
           List<Role> roles = 
           ((User)filterContext.HttpContext.Session["CurrentUser"]).Roles;
           bool allowed = SecurityHelper.IsAccessible(AllowFeature, roles);
             if (!allowed)
                {
                    filterContext.Result = new HttpUnauthorizedResult();
                }
            }
        }
    }
    

    在你的行动方法中

        [FeatureAuthentication(AllowFeature="USR_SAVE")]
        public ActionResult Index()
        {
        }
    

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      您可以使用过滤器属性:

      public class ACLCheckAttribute : FilterAttribute, IActionFilter
      

      在 OnActionExecuting 中,您可以获取 USR_SAVE。在不知道它来自哪里的情况下,我会假设它来自:

      • 表单:您可以通过导航到 HttpContext.Request.Form 集合从传递给 ONActionExecuting 的上下文中获取任何表单值
      • Session 等:HttpContext 也会有这些。
      • 动作方法:从一个属性中,使用为动作传入的上下文,它有一个可以像字典一样访问的 ActionParameters 列表,允许您检查和提取您的值

      如果在其他地方,请评论在哪里。您可以将此属性应用到控制器或方法,或通过将其添加到 globalfilters 集合 (GlobalFilters.Filters.Add()) 或 App_Start 文件夹中的 FilterConfig 文件来全局设置它。

      【讨论】:

      • 在这里使用IAuthorizationFilter 怎么样?我刚刚发布了我对这个问题的答案
      • 你说得对,我应该使用那个界面。这里早上太早了:-)
      • 不错。你的回答很有帮助,这促使我回答:)
      猜你喜欢
      • 2015-11-21
      • 1970-01-01
      • 2011-07-01
      • 2015-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多