我的MVC5.1应用程序使用基于http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown
的OWIN身份验证db和login验证中的用户持久性由我的自定义UserService类处理。当使用个人帐户登录系统时,这非常适用。
我还需要使用Windows身份验证(Active Directory)。因此,如果打开了Windows身份验证(在IIS和我的web.config中的一个标志上),将对我的数据库验证AD用户,以查看登录用户是否可以访问我的Web应用程序,如果是,请登录(设置)应用程序cookie)。
我在IIS中启用了Windows Auth,在IIS中禁用了匿名身份验证,并从我的web.config文件中删除了<authentication mode="None" />
。这使得OWIN认为用户已经过身份验证,即使在启动时我将其配置为使用ApplicationCookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
这很好,我可以编写一个围绕AuthenticationManager.User.Identity.IsAuthenticated属性的包装器,并添加检查以根据我的数据库验证用户。但后来我无法添加自定义声明,因为OWIN似乎没有使用应用程序Cookie,而是直接使用WindowsClaimsIdentity。
我的登录功能(尝试添加其他声明的功能)如下:
_authenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
var identity = new ClaimsIdentity(
new[] {
new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString()),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.UserData, user.CurrentDomainID.ToString())
},
DefaultAuthenticationTypes.ApplicationCookie,
ClaimTypes.Name,
ClaimTypes.Role);
_authenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
现在,如果我在web.config中添加行<authentication mode="None" />
,它似乎正在工作,这意味着OWIN只在其cookie中查找声明,并且在用户存在于数据库中之前不会对用户进行身份验证。
但在这两种情况下,我都被困在登录页面的重定向循环中,除非我从启动中删除登录路径。我尝试在登录控制器中设置Response.SuppressFormsAuthenticationRedirect = false,但没有更改。
我面临的另一个问题是,即使我在Windows中使用我的AD帐户登录,浏览器也不会显示登录页面,直到我在基本身份验证弹出窗口中输入有效的用户名/密码。有没有办法隐藏这个弹出窗口?