【问题标题】:OWIN Mixed Authentication IIS IssueOWIN 混合身份验证 IIS 问题
【发布时间】:2019-09-08 15:54:23
【问题描述】:

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

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

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

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

Authentication - Windows to Read/Write  

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    在我看来,如果你想获取当前用户的登录信息,我建议你可以尝试使用 session 在 ExternalLoginCallback 方法中存储用户帐户中的 windows 登录信息。

    更多细节,您可以参考以下代码:

        [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 });
            }
        }
    

    结果:

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 2014-01-28
        • 1970-01-01
        • 2014-09-15
        • 2018-06-04
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 2011-12-03
        相关资源
        最近更新 更多