ASP.NET MVC5提示Windows身份验证忽略身份验证模式

时间:2020-03-05 13:54:01

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

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

我保持Forms身份验证/ RoleProvider不变,但我的想法是在HttpPost中触发ActionResult Login的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 ();
}

您可以实现等效的东西吗?

2 个答案:

答案 0 :(得分:0)

您的问题可能比这更复杂,但是从您发布的内容来看,即使在验证所有登录名(SQL和Windows)之后,通常也会将用户重定向到登录页面,因为您没有添加表单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");

希望有帮助

答案 1 :(得分:0)

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

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

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

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