ASP.Net MVC - OWIN - 允许Windows /个人身份验证

时间:2017-03-23 22:41:54

标签: c# asp.net-mvc authentication

我有一个ASP.Net MVC 5应用程序,它目前正在使用个人身份验证(没有身份验证/匿名访问的account / login.cshtml页面)和OWIN。工作正常。

由于这是一个内部网应用程序,我想允许用户在其Windows帐户,另一个用户Windows帐户或应用程序帐户(管理员,特殊用户等)下登录 - 这些帐户没有关联的域帐户。

对于第一个选项,我想在登录屏幕上显示他们的Windows用户名,他们只需点击" ok"按钮登录。要获取用户名,我修改了Visual Studio Project属性以禁用匿名身份验证并启用Windows身份验证。还修改了web.config并将身份验证模式设置为Forms。这导致" HTTP错误404.15 - 未找到"。这似乎是由于OWIN引起的身份验证循环,需要修复以下建议:

  • 确保登录控制器方法允许匿名访问(默认情况下似乎是这样)。
  • 或Modify Startup.auth,注释掉LoginPath属性。
  • 或修改web.config,添加appSetting" owin:AutomaticAppStartup"有价值"假"。

我选择了LoginPath修复程序,这似乎有效(因为web.config更改),因为没有错误,登录页面显示windows用户名(使用System.Threading.Thread.Currentprinciple.Identity检索。名称)。

现在的问题是,一旦用户登录,OwinContext就没有用户(HttpContext.GetOwinContext()。GetUserManager())。

理想情况下,我不需要IIS或OWIN进行任何身份验证,因为它是由应用程序完成的 - 但我需要初始请求(对于帐户/登录页面)包含Authenticate标头,以便我可以得到Windows用户。

首先,我想了解导致" HTTP错误404.15"并修复。 其次,如何让OWIN使用身份验证更改 - 我只需要它来持久保存用户进行控制器身份验证。

1 个答案:

答案 0 :(得分:0)

这只是猜测,但我认为错误是由您所描述的错误配置引起的:您已将身份验证模式设置为“表单”,但将项目设置为使用Windows身份验证。它可能令人困惑,但Windows身份验证不是表单身份验证。当您使用表单身份验证时,用户提供表单中的凭据,该表单是针对用户存储提交,验证(包括所有反伪造的优点)(我相信您使用的是ASP.NET身份,这将是“个人身份验证”的默认设置) “设置”,如果验证成功,则要设置的cookie包含在响应中。然后,此cookie用于验证进一步的请求。

正如Katana documentation所证实的那样,没有用于Windows身份验证的内置中间件 - 微软只是假设应该使用IIS。这有效地阻止了我们 轻松 将Katana OWIN中间件提供商与Windows身份验证相结合。现在,轻松是关键词:我们仍然可以“破解”我们的方式。

不幸的是,它仍然是一个黑客:我还没有找到一种方法使身份验证“透明”(如“用户打开登录表单,可以输入AD帐户凭据或个人帐户凭证和一切正常“)。您需要为每个Windows用户维护个人帐户记录(就像使用任何外部OWIN中间件一样,例如Google或Facebook)。您可以自动创建帐户和关联,并使其看起来透明。您可以为Windows身份验证添加“外部提供程序”按钮。

对用户进行身份验证(在单独的“AD身份验证”控制器中):

bool userWindowsAuthentication = Request.LogonUserIdentity.IsAuthenticated;

if (userWindowsAuthentication) {
    var userStoreDatabaseContext = new ApplicationDbContext();
    var userStore = new UserStore<UserModel>(userStoreDatabaseContext);
    var userStoreManager = new UserManager<UserModel>(userStore);
    var userWindowsLoginCredentials = GetWindowsLoginInfo();

    var existingInternalUser = userStoreManager.FindAsync(userWindowsLoginCredentials.UserName)

    if (existingInternalUser) {
       // It means that the user already exists in the internal provider and here you simply authenticate and redirect to destination
    } else {
       // It means that the user does not exist. You can automatically create the internal user record here and associate the Windows user with the internal record.
    }
} else {
    // It means that user is not signed in using Windows authentication, so you either want to redirect back to the login page or restrict access or do something else
}

正如你所看到的,它是“脏”的。另一个黑客攻击:您可以拥有仅接受Windows身份验证的其他层(单独的应用程序或虚拟应用程序)。此应用程序可以是您的登录资源。如果用户通过Windows AD进行身份验证,则可以将其重定向到正确的登录页面。您可以更进一步,并在重定向请求标头中添加他们的登录信息,但如果您这样做 - 标头必须加密,以确保Windows身份验证不能伪造,唯一应该能够解密和验证它应该是你的主要应用。再次,脏,但有效。