ASP.NET MVC3:自定义[authorize]属性

时间:2012-01-19 09:05:57

标签: asp.net asp.net-mvc-3 security attributes

在我的数据库中,系统用户有一个他/她可以访问的模块列表。

我希望能够添加一个authorize属性来检查是否属实。

E.g。 [authorise(UserID, ControllerName)]

某些代码,确保指定了UserID的用户在其列表中具有控制器名称。

目前,您可以通过使用URL简单地绕过标签不可见的事实。 (我的代码已经检查用户是否已指定访问权限并隐藏/显示标签)

3 个答案:

答案 0 :(得分:7)

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

        string currentUser = httpContext.User.Identity.Name;
        string currentController = httpContext.Request.RequestContext.RouteData.GetRequiredString("controller");

        // TODO: go hit your database and see if currentUser can access
        // currentController and return true/false from here

        ...
    }
}

然后装饰你的控制器或动作:

[MyAuthorize]
public class FooController: Controller
{
    ...
}

据说我怀疑你可能在数据库设计中走错了方法,存储了哪个用户有权访问哪个控制器操作的列表。可能你应该使用角色。让数据库了解控制器只是感觉不对。

所以:

[Authorize(Roles = "Foo,Bar")]
public class FooController: Controller
{
    ...
}

只有具有FooBar角色的用户才能访问FooController

答案 1 :(得分:1)

您可以创建新属性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new HttpUnauthorizedResult();
        }


        bool authorized = // Perform custom logic

        If(!authorized)
        {
            filterContext.Result = new RedirectResult(/* Your access denied url */);
        }
    }

}

答案 2 :(得分:0)

创建模型时,请检查权限

DisplayAdminLink = _permissionService.Authorize(StandardPermissionProvider.AccessAdminPanel),

并在视图中

    @if (Model.DisplayAdminLink)
    {
        <li><a href="@Url.Content("~/admin")" class="ico-admin">@T("Account.Administration")</a>
        </li>
    }
相关问题