OWIN混合身份验证IIS问题

时间:2019-04-18 10:12:28

标签: iis owin forms-authentication windows-authentication mixed-authentication

我有一个需要Windows身份验证和表单登录的项目。我碰到了OWIN Mixed Authentication,似乎符合我的要求。

在实施到我自己的项目之前,我尝试从源链接运行示例解决方案。

我使用IIS Express调试了解决方案,当我在Windows身份验证对话框中输入凭据时,在logonUserIdentity变量中找到了我的正确凭据。

但是,当我设置本地IIS站点时,请按照自述文件中的说明添加以下功能委托属性:

Authentication - Windows to Read/Write  

当我在Windows身份验证对话框中输入凭据时,在logonUserIdentity变量中输入的是 NT AUTHORITY \ IUSR ,而不是我在对话框中输入的用户名。

我之所以会这样,是因为IIS站点上启用了 AllowAnonymous ,但是需要停止CookieAuthentication类中的Startup.Auth导致的登录循环。< / p>

我应该如何设置IIS站点,以便Windows凭据对话框通过输入的凭据而不是NT AUTHORITY \ IUSR。

2 个答案:

答案 0 :(得分:0)

  

我使用IIS Express调试了解决方案,当我在Windows身份验证对话框中输入凭据时,可以在logonUserIdentity变量中找到我的正确凭据。

据我所知,IIS Express使用当前的计算机登录帐户作为匿名登录帐户。因此,您会发现logonUserIdentity是正确的。您可以尝试使用其他域帐户登录该应用程序。您会发现它仍使用当前的计算机登录帐户,但未更改为登录用户帐户。

由于混合身份验证允许多种登录方式,因此您应始终启用匿名登录,以使没有域帐户的人登录。

mix自己的身份验证使用asp.net身份外部登录来实现与Windows的登录。asp.net身份外部登录将首先转到mixauth提供程序以检查Windows身份验证结果。

如果成功,它将返回带有Windows信息的帐户控制器的ExternalLoginCallback方法,并使用此信息,身份将生成一个身份用户。

我认为,如果要获得用户的当前登录名,建议您尝试使用会话将Windows登录名存储在ExternalLoginCallback方法中的用户帐户中。

更多详细信息,您可以参考以下代码:

    [AllowAnonymous]
    public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
    {

        var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

        Session["LoginonUsername"] = loginInfo.DefaultUserName;
        if (loginInfo == null)
        {
            return RedirectToAction("Login");
        }

        // Sign in the user with this external login provider if the user already has a login
        var result = await SignInManager.ExternalSignInAsync(loginInfo, isPersistent: false);
        switch (result)
        {
            case SignInStatus.Success:
                return RedirectToLocal(returnUrl);
            case SignInStatus.LockedOut:
                return View("Lockout");
            case SignInStatus.RequiresVerification:
                return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
            case SignInStatus.Failure:
            default:
                // If the user does not have an account, then prompt the user to create an account
                ViewBag.ReturnUrl = returnUrl;
                ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
                return View("ExternalLoginConfirmation", new ExternalLoginConfirmationViewModel { Email = loginInfo.Email });
        }
    }

结果:

enter image description here

答案 1 :(得分:0)

我的IIS网站绑定设置为http://projectname

当我将IIS站点上的绑定更改为http://localhosthttp://pcname时,它允许我通过正确的Windows凭据。