【问题标题】:ASP.NET MVC5 Prompt Windows Auth ignoring authentication modeASP.NET MVC5 提示 Windows Auth 忽略身份验证模式
【发布时间】:2020-06-18 04:17:58
【问题描述】:

我放弃了在同一个项目中实现 Windows 和 Forms 身份验证模式,我遇到了无限登录循环、授权错误和噩梦般的意大利面条代码。

我保持 Forms authentication / RoleProvider 保持原样,但我的想法是在 ActionResult Login 的 HttpPost 中触发 Windows 身份验证,因此用户将输入他们的域用户名,按下登录按钮,然后将文本输入与HttpContext 身份,如果 true 提示 Windows 身份验证,如果登录成功则重定向到 admin/user 对应的网页(从 SQL 表中获取角色)。

这是我伪编码的一个模糊概念。

[HttpPost]
public ActionResult Login (usuario u, string retornaUrl) {
    string userDomWin = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name.ToString ().Substring ((HttpContext.User.Identity.Name.ToString ().IndexOf ("\\")) + 1);
    string userWin = userDomWin.Replace ("DOMAIN\\", "");

    var usuarioSys = (from d in db.usuario where d.usuarioDom == userWin select d.usuarioDom).FirstOrDefault ();

    if (usuarioSys != null) {
        //TRIGGER WINDOWS AUTH

        if (WINDOWSAUTH == true) {

            Session["uname"] = usuarioSys.ToString ();

            if (usuarioSys != null) {
                return Redirect ("~/Home/Index");
            } else {
                TempData["Message"] = "FINISHED.";
                return Redirect ("~/Account/Login");
            }
        } else {
            TempData["Message"] = "UNAUTOHRIZED.";
            return Redirect ("~/Account/Login");
        }

    }

    return View ();
}

你能实现一些等效的东西吗?

【问题讨论】:

    标签: c# sql asp.net asp.net-mvc


    【解决方案1】:

    我不确定您项目的网络配置是如何设置的,但请务必检查您是否将身份验证模式设置为表单

    <system.web>
        <authentication mode="Forms">  
           <forms loginUrl="Home/Login"></forms>  
        </authentication>  
    

    至于为什么 MVC 身份验证/授权难以设置/经常出现问题,有一个 very useful thread 为我澄清了这一点。

    就个人而言,至少对于内部应用程序,我更喜欢通过设置自己的功能来使用 Windows 身份验证来检查部署应用程序的域上的 Active Directory 组。原因是,对于内部应用程序,“当前用户”通常由他们登录的唯一员工 ID 标识,因此应用程序更容易检查授权的活动目录组以查看他们是否应该/应该不要访问它。

    【讨论】:

    • 我很想通过 AD 管理用户,但由于安全策略,我无法管理任何形式的组。此外,管理也很复杂,因为“允许的用户”每月轮换一次,做组更多的是体力劳动,而不是更新 SQL 表上的数据。
    • 那么您是否打算拥有一个包含允许用户的 SQL 表?因为如果是这样,您只需要通过 (System.Web.HttpContext.Current.Request.LogonUserIdentity.Name) 检查最终用户是谁,并调用存储的过程来查看他们是否在该表中。在每个 ActionResult 的开头应用相同的函数调用逻辑,以确保只有授权的人才能访问您的应用程序。如果您想查看一些示例代码,请告诉我,我可以编辑我的原始答案。
    • 是的,这就是为什么我使用string userDomWin = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name.ToString ().Substring ((HttpContext.User.Identity.Name.ToString ().IndexOf ("\\")) + 1);} 获取名称,然后在允许的用户表中进行比较,但我还需要使用他们的 Windows 密码验证它们。在其他用户X 使用用户Y 计算机的情况下。如果您有解决方法,我将不胜感激。
    • 如果您担心其他用户使用其他人的计算机,那么您不应该使用 windows 身份验证,因为 windows 身份验证的重点是使用登录计算机的任何人的 Windows 用户帐户首先访问您的应用程序(尽管这更多是对 privs 安全问题的升级)。正如我的回答中提到的,请确保您已将身份验证方法设置为表单。
    【解决方案2】:

    您的问题可能比这更复杂,但从您发布的内容来看,即使在验证了所有登录(SQL 和窗口)之后,您的用户也被重定向到登录页面是正常的,因为您没有添加表单 cookie到响应。 如果这是问题的根源,这是我返回表单 cookie(加密)的代码

                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                       2,
                       userName,
                       DateTime.Now,
                       DateTime.Now.AddMinutes(480),
                       true,
                       role,
                       FormsAuthentication.FormsCookiePath);
    
                string encTicket = FormsAuthentication.Encrypt(ticket);
                var response = System.Web.HttpContext.Current.Response;
                response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
                return RedirectToAction("Index", "Home");
    

    希望对你有帮助

    【讨论】:

    • 作为Form模式我没有问题,它与我作为第一安全层实现的Windows身份验证模式直接相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多