0

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

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

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

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

Authentication - Windows to Read/Write  

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

我觉得发生这种情况是因为在 IIS 站点上启用了AllowAnonymous,但它需要停止由于类CookieAuthentication内而发生的登录循环Startup.Auth

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

4

2 回答 2

0

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

据我所知,IIS express 使用当前计算机登录帐户作为匿名登录帐户。所以你会发现 logonUserIdentity 是对的。您可以尝试使用不同的域帐户登录应用程序。您会发现它仍然使用当前计算机登录帐户,没有更改为登录用户帐户。

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

mix自己的认证使用asp.net身份外部登录实现windows登录。asp.net身份外部登录会先到mixauth提供者检查windows认证结果。

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

在我看来,如果你想获取当前用户的登录信息,我建议你可以尝试使用 session 将 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 });
        }
    }

结果:

在此处输入图像描述

于 2019-04-19T08:30:12.323 回答
0

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

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

于 2019-04-19T11:58:16.253 回答