ASP.MVC:关注点和自定义属性类与授权的分离

时间:2015-03-16 16:31:17

标签: c# asp.net-mvc asp.net-mvc-4 separation-of-concerns actionfilterattribute

我正致力于分离MVC中的问题。目前所有内容都混淆了(库函数,扩展,自定义过滤器属性,数据访问级别),但我希望有两个独立的项目(MySolution.Lib和MySolution.DBModel)。我想将自定义过滤器属性分离到Lib项目。 DBModel已经引用了Lib,所以除了这个之外,我已经完成了所有工作。实现这个的最佳方法是什么?是否可以传递给另一个自定义属性中的属性值,并且只对属性实现中的文本起作用。所以属性将使用这样的东西:

[AuthorizeUser(AccessLevel = "Admin", UserRights = DBModel.User.GetUserRights(HttpContext.User.Identity.Name)]
public ActionResult MyAction()

这是当前的实施

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    // Custom property
    public string AccessLevel { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (!isAuthorized)
        {
            return false;
        }

        List<string> accessLevels = AccessLevel.Split(new[] {','}).ToList();

        //this is taken from DB by GetUserRights() method from MySecurity static class
        var privilegeLevels = MySecurity.GetUserRights(httpContext.User.Identity.Name);


        return accessLevels.Any(privilegeLevels.Contains)
               || privilegeLevels.Contains("Admin") || privilegeLevels.Contains("Super User");
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        var helper = new UrlHelper(filterContext.RequestContext);
        filterContext.HttpContext.Response.Redirect(helper.Action("Index", "Unauthorized"));
    }

}

0 个答案:

没有答案