如何基于Session数据在ASP.NET MVC中实现授权检查?

Kel*_*sey 8 c# asp.net security asp.net-mvc forms-authentication

这将是我的第一个带有表单身份验证的ASP.NET MVC应用程序,所以我试图确保我不会错过任何东西.场景是这样的:公共/安全区域.

在私人区域内,它甚至进一步限于特定区域/用户.这些"区域"由对每个用户组自定义的基本区域的自定义定义.

例如,用户可以访问url /Area/Controller/Action.他们需要获得安全区域的许可,否则他们将被重定向到登录视图.

我一直在阅读AuthorizeAttribute但我不确定我应该如何/在哪里进行这些基本检查.我最初的预感是在用户的IP成功登录以及他们有权访问的内容等详细信息后,在会话中存储用户对象.

每个安全控制器调用的授权检查将验证会话中是否存在有效用户对象,IP仍然匹配,并且用户可以访问特定区域.这个设置有没有明显的漏洞?

编辑:在哪里/如何实现这些检查,以便当控制器被[授权]标记时,它将执行那些会话对象检查?

任何指针或建议将不胜感激.谢谢.

Kel*_*sey 11

好吧,看起来我选择了自定义AuthorizeAttribute.实际上非常简单.这是代码:

namespace MyApp.Custom.Security
{
    public class Secure : AuthorizeAttribute
    {
        /// <summary>
        /// Checks to see if the user is authenticated and has a valid session object
        /// </summary>        
        /// <param name="httpContext"></param>
        /// <returns></returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null) throw new ArgumentNullException("httpContext");

            // Make sure the user is authenticated.
            if (httpContext.User.Identity.IsAuthenticated == false) return false;

            // This will check my session variable and a few other things.
            return Helpers.SecurityHelper.IsSignedIn();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在我的控制器上,我只需要放置一个[Secure]属性,并且只要访问控制器,它就会使用上面的函数.很简单.我也做了一个[SecureByRole]属性,它做了所有相同的东西,但也检查我的自定义角色信息.没有必要为所有内置伏都教的罐头会员:)