代码之家  ›  专栏  ›  技术社区  ›  Kelsey

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

  •  8
  • Kelsey  · 技术社区  · 15 年前

    这将是我第一个使用表单身份验证的ASP.NET MVC应用程序,因此我正在努力确保不会遗漏任何内容。场景如下:公共/安全区域。

    在私人区域内,它甚至进一步限于特定区域/用户。这些“区域”通过对每个用户组自定义的基本区域的自定义来定义。

    /Area/Controller/Action . 他们需要获得进入安全区域的许可,否则将被重定向到登录视图。

    AuthorizeAttribute

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

    编辑:

    任何指点或建议都将不胜感激。谢谢

    4 回复  |  直到 15 年前
        1
  •  11
  •   Kelsey    15 年前

    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();
            }
        }
    }
    

    然后在我的控制器上我只需要放一个 [Secure] [SecureByRole] 属性,它执行所有相同的操作,但也检查我的自定义角色信息。不需要为所有来自罐头会员的内置巫毒:)

        2
  •  2
  •   xandy    15 年前

    试着看一下 RoleProvider class . 这是ASP.net如何对用户使用基于角色的授权的基本框架。我认为你应该使用 [Authorize(Roles='...')] 属性来利用它。

        3
  •  1
  •   Neal    15 年前

    在我以前的应用程序中,我使用了一个简单的HttpModule,用额外的角色等来增强经过身份验证的用户(我这样做是因为我的需求非常有限)。

    public class AuthorisationModule : IHttpModule
    {
        public void Init( HttpApplication context )
        {
            context.AuthorizeRequest += AuthorizeRequest;
        }
    
        private void AuthorizeRequest(object sender, EventArgs e)
        {
            var currentUser = HttpContext.Current.User;
            if( !currentUser.IsAuthenticated() )
            {
                return;
            }
    
            var roles = new List<string>();
            // Add roles here using whatever logic is required
    
            var principal = new GenericPrincipal( currentUser.Identity, roles.ToArray() );
            HttpContext.Current.User = principal;
        }
    
        public void Dispose()
        {
            if(HttpContext.Current == null )
            {
                return;
            }
    
            if(HttpContext.Current.ApplicationInstance == null)
            {
                return;
            }
    
            HttpContext.Current.ApplicationInstance.AuthorizeRequest -= AuthorizeRequest;
        }
    }
    
        4
  •  1
  •   Tawani    11 年前
    [Authorize]
    public class BaseController : Controller
    {
        protected override void OnAuthorization(AuthorizationContext authContext)
        {
            if
                (
                !User.Identity.IsAuthenticated &&
                Request.LogonUserIdentity != null &&
                Request.LogonUserIdentity.IsAuthenticated
                )
            {
                var logonUserIdentity = Request.LogonUserIdentity.Name;
                if (!string.IsNullOrEmpty(logonUserIdentity))
                {
                    if (logonUserIdentity.Contains("\\"))
                        logonUserIdentity = logonUserIdentity.Substring(logonUserIdentity.IndexOf("\\") + 1);
    
                    var db = new UsersContext();
                    var loginUser =
                        db.UserProfiles.FirstOrDefault(x => x.UserName == logonUserIdentity);
    
                    //Auto-Login Windows Identity
                    if (loginUser == null)
                        loginUser = CreateUser(db, logonUserIdentity);
    
                    if (loginUser != null)
                    {
                        FormsAuthentication.SetAuthCookie(loginUser.UserName, true);
    
                        string returnUrl = Request.RawUrl;
                        if (!string.IsNullOrEmpty(returnUrl))
                            Response.Redirect(returnUrl);
                        Response.Redirect("~/");
    
                    }
                }
            }
        }
    
        private static UserProfile CreateUser(UsersContext db, string logonUserIdentity)
        {
            var user = new UserProfile {UserName = logonUserIdentity};
            db.UserProfiles.Add(user);
            db.SaveChanges();
            return user;
        }
    }