Owin + DefaultAuthenticationTypes.ApplicationCookie + Windows身份验证

时间:2014-08-11 12:09:22

标签: asp.net-mvc asp.net-identity owin claims-based-identity

我的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帐户登录,浏览器也不会显示登录页面,直到我在基本身份验证弹出窗口中输入有效的用户名/密码。有没有办法隐藏这个弹出窗口?

0 个答案:

没有答案