我放弃了在同一项目中实施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 ();
}
您可以实现等效的东西吗?
答案 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标识,因此该应用程序更容易根据授权的活动目录组检查是否应该/不应该使用无法访问。