ASP MVC:实现ASP MVC安全性时感到困惑

时间:2011-07-05 16:11:56

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

我正在实现ASP MVC应用程序的安全性部分,我对如何实现自定义成员资格提供程序感到困惑,因为似乎有很多我不会使用的功能。

我正在移植的应用程序通常通过存储在名为“SecurityManager”的会话中的对象来管理安全性,该对象包含当前用户和表单权限集合。此集合的每个项目包含每个登录用户表单的权限以及该表单的每个字段的权限(如果不是完全控制表单,则需要它们。)

但是,当我看到MembershipProvider和AuthorizeAttribute标记的方法时,他们认为我将使用我的应用程序不使用的角色,我们只有权限组,这些权限组只是为某些用户组组合在一起的权限,但是往往会及时改变。

所以基本上我唯一需要的就是在发出请求时会检查安全管理器是否存储在会话中(如果用户未经过身份验证并且将被重定向到登录页面)然后从会话中获取该对象并使用它执行操作以了解用户是否可以访问该视图。

最好的方法是什么?我读过绕过自定义会员资格并不是一个好主意。

1 个答案:

答案 0 :(得分:1)

更新:我最近反对这一点,并想出如何使用AuthorizeAttribute完全按照您的意愿行事。我的属性验证用户是否为管理员,其工作方式如下:

public class AuthorizeAdminAttribute : AuthorizeAttribute
{
    public bool IsValidUser { get; protected set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null) { throw new ArgumentNullException("httpContext"); }

        // Make sure Forms authentication shows the user as authenticated
        if (httpContext.User.Identity.IsAuthenticated == false) return false;

        // Retrieve the unit of work from Windsor, and determine if the current user is an admin
        var unitOfWork = Bootstrapper.WindsorContainer.Resolve<IUnitOfWork>();
        var user = new UserByIdQuery(unitOfWork).WithUserId((int)Membership.GetUser().ProviderUserKey).Execute();

        if (user == null)
            return false;

        // Otherwise the logged in user is a real user in the system
        IsValidUser = true;

        return user.IsAdmin;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext == null) { throw new ArgumentNullException("filterContext"); }

        // If this user is a valid user but not an admin, redirect to the homepage
        if (IsValidUser)
        {
            // Redirect them to the homepage
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
            {
                { "area", "" },
                { "action", "Index" },
                { "controller", "Home" }
            });
        }
        else
        {
            // User isn't logged in, perform normal operations
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

基本上,您必须使用AuthorizeCore()来确定用户是否已登录,存储该结果,然后对系统中的角色执行授权。然后在您的HandleUnauthorizedRequest中,您必须弄清楚该请求是否未经授权,因为该用户未登录,或者是因为他们未获得授权。

<小时/> 旧答案 我通过创建Authorize类的子类来完成AuthorizeAttribute属性的使用。例如:

public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (httpContext == null) { throw new ArgumentNullException("httpContext"); }

        // Make sure Forms authentication shows the user as authenticated
        if (httpContext.User.Identity.IsAuthenticated == false) return false;

        // replace with whatever code you need to call to determine if the user is authorized
        return IsUserAuthorized();
    }
}

现在,当调用控制器或操作并使用[MyCustomAuthorize]进行修饰时,它将运行此代码以确定用户是否基于您的自定义逻辑进行授权,如果不是,则会将它们重定向到{{1} 1}}属性会。

我不知道这是否是最好的方法,但这是我想出来的。