【问题标题】:ASP MVC: Getting confused when implementing ASP MVC SecurityASP MVC:在实现 ASP MVC 安全性时感到困惑
【发布时间】:2011-07-05 16:11:56
【问题描述】:

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

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

但是,当我看到 MembershipProvider 和 AuthorizeAttribute 标签的方法时,他们假设我将使用我的应用程序不使用的角色,我们只有权限组,这些权限组只是针对某些用户组组合在一起的权限,但它们往往会随时间变化。

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

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

【问题讨论】:

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


    【解决方案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 中,您必须确定该请求是否因为用户未登录而未经授权,或者是因为他们未获得授权。


    旧答案 我通过创建AuthorizeAttribute 类的子类来完成使用Authorize 属性。例如:
    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] 装饰时,它将运行此代码以确定用户是否根据您的自定义逻辑获得授权,如果没有,则将它们重定向到[Authorize] 属性的确切方式会的。

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

    【讨论】:

    • 如果这偏离了轨道,请原谅我。如果我创建自己的从 ActionFilterAttribute 继承的 ChkSecurityAttribute 并检查覆盖的 OnActionExecuting 事件中的安全性,有什么区别?从 AuthorizeAttribute 继承它有什么好处(它是否需要实现表单身份验证和/或成员资格)?最后,我想知道当用户未经授权时重定向到“您无权访问”页面的最佳位置是什么。谢谢。
    • 老实说,我不知道,除了可能更少的手工工作。例如,如果您创建自己的操作过滤器,则必须放入您自己的 Roles 属性以获取该属性或您希望使用的任何其他 AuthorizeAttribute 属性(诚然,这并不难)。要处理授权问题(用户已登录但无权访问),您需要返回 403 http 结果,尽管我不确定如何从 AuthorizeAttribute 执行此操作,并且自定义操作过滤器可能更容易
    • 我也不会害怕在 Asp.NET 成员框架之外工作以进行授权当需要时。会员提供程序系统主要是允许一个通用接口来进行身份验证/授权,但是通过您使用自定义提供程序,您已经表明您的要求超出了默认提供程序的范围,并且您可能会更改为另一个非那时自定义提供程序几乎为零。
    • 感谢您提供详细信息。是的,我从过去开始就不是会员 API 的粉丝,所以我一直在寻找单独的东西,如果一切都可以在这个自定义属性的操作过滤器中手动处理(我可以作为字符串数组的角色) - 我必须弄清楚如果一个简单的重定向到“禁止访问”页面是否有效。当用户登录时,我的身份验证/授权设置在 Session 变量中(这里再次没有会员资格)。我很高兴使用“AuthorizeAttribute”,但我能否在“没有”会员资格的情况下完成此操作,或者这是否需要自定义会员资格提供程序(和角色提供程序)实施。
    • 我看不出有什么理由你不能在 Membership API 之外完成这项工作,而且我真的看不出有什么理由仅仅创建自己的操作过滤器会更困难。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2013-11-21
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多