【问题标题】:asp.net mvc user authentication/permissionasp.net mvc 用户身份验证/权限
【发布时间】:2009-12-14 14:18:53
【问题描述】:

我是 asp.net mvc 的新手并开始以下项目。该公司想要一个内网网站,供不同群体的人将文件上传到数据库,运行报告并修改数据库中几个主表中的数据。该公司使用 Active Directory,不希望用户再次登录以使用该网站。该网站将针对不同的组有不同的部分,并且用户对特定页面的访问应通过数据库进行控制。

到目前为止,这就是我想出的

  1. 将成员资格提供程序更改为链接到 Active Directory 服务器 (based on Mike's blog post)
  2. 删除了 AccountController 和 Views/Account 文件夹
  3. 创建了一个基于this link的自定义认证类

我需要根据用户的 AD id、他的“角色”(int)从数据库中的表中提取,然后将其转换为相关的 SiteRoles。在 CustomAuthorizeAttribute 中实施此查询是否可行?有没有更好的地方从表中提取数据并将其存储在某个地方以便可以重复使用,而不是每次调用 AuthorizeCore 时都必须运行数据库查询(每当用户调用控制器/动作时都会发生这种情况)?

【问题讨论】:

    标签: asp.net-mvc active-directory


    【解决方案1】:

    自定义AuthorizeAttribute 肯定是要走的路,因为它将所有其他操作过滤器之前应用。

    善良,

    【讨论】:

      【解决方案2】:

      我会使用开箱即用的ActiveDirectoryMembershipProvider 而不是自定义属性(因为重新发明轮子通常是不好的,在大多数情况下,在安全领域重新发明轮子是不好到无能的地步)和 AzMan Role Provider 将 AD 组和帐户映射到应用角色。

      与自定义代码相比,这种配对为您提供了更多开箱即用的功能(例如,用于权限的标准化 GUI 界面),并且可能也更安全。

      【讨论】:

        【解决方案3】:

        您可以使用 MVC 提供的 FormAuthentication 做任何您想做的事情。只需在 AccountController 中创建您的自定义 ValidateLogOn 方法。示例:

        
        public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
                {
        
                    if (!ValidateLogOn(userName, password))
                    {
                        return View();
                    }
        
                    FormsAuth.SignIn(userName, rememberMe);
                    Session["userlogin"] = userName;
        
                    if (!String.IsNullOrEmpty(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
        

        您的 ValidateLogOn 将类似于:

        
                private bool ValidateLogOn(string userName, string password)
                {
                    if (String.IsNullOrEmpty(userName))
                    {
                        ModelState.AddModelError("username", "You must specify a username.");
                    }
                    if (String.IsNullOrEmpty(password))
                    {
                        ModelState.AddModelError("password", "You must specify a password.");
                    }
                    /*
                     * Do your LDAP Validation stuff (DB queries, etc) here.
                     */
                 }
        

        【讨论】:

        • 一个问题是我有一个要求 - 用户不需要输入他们的用户名或密码,因为他们已经在您的计算机上登录到 AD。
        猜你喜欢
        • 2011-06-26
        • 2011-03-12
        • 2013-08-29
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2012-12-02
        • 2017-05-05
        • 1970-01-01
        相关资源
        最近更新 更多