【问题标题】:ASP.Net - Using Basic Authentication without having Windows UsersASP.Net - 在没有 Windows 用户的情况下使用基本身份验证
【发布时间】:2009-12-11 11:00:45
【问题描述】:

我们有一个在 IIS6 上运行的 ASP.Net Web 应用程序,它管理自己的用户数据库。

网站本身只允许匿名访问,所有身份验证/安全性都使用我们的应用程序本身进行管理。

我们有一个页面,其中包含一个 HTML 数据表,我们将这些数据导入 Excel,然后用于报告目的。该页面目前未实施任何安全措施。

我们需要为此页面增加安全性,这样如果这些电子表格落入坏人之手,那么如果不提供用户名/密码,就无法“刷新”数据。

如果我将此页面设置为不允许匿名用户访问,那么我可以对 Windows 用户使用 Basic/Windows 身份验证来保护此页面的安全。然后当Excel刷新数据时弹出密码对话框。

问题是我需要能够根据我们数据库中的用户来保护此页面,并且他们不会是 Windows 用户。我还需要以允许 Excel 管理排除任何基于表单的身份验证的身份验证的方式来执行此操作。

有人有什么想法吗?是否可以让 IIS 在别处寻找它的基本身份验证?

【问题讨论】:

    标签: asp.net iis authentication


    【解决方案1】:

    好的,所以我找到了两个解决这个问题的方法。感谢 Zhaph - Ben Duguid 的回答,它是一个允许 ASP.Net 完全管理身份验证的 HttpModule。

    第二个解决方案,也是我要采用的解决方案,感谢这个问题/答案。

    HTTP Authentication (Basic or Digest) in ASP Classic via IIS

    我已将其剥离,并有一个似乎运行良好的简单测试工具。在此示例中,它仅检查用户名和密码是否匹配并认为已通过身份验证,而不是数据库调用。

    using System;
    using System.Text;
    
    namespace AuthenticationTests
    {
        public partial class _Default : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string authorisationHeader = Request.ServerVariables["HTTP_AUTHORIZATION"];
    
                if (authorisationHeader != null && authorisationHeader.StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))
                {
                    string authorizationParameters = Encoding.Default.GetString(Convert.FromBase64String(authorisationHeader.Substring("Basic ".Length)));
                    string userName = authorizationParameters.Split(':')[0];
                    string password = authorizationParameters.Split(':')[1];
    
                    if (userName == password) //Perform your actual "login" check here.
                    {
                        //Authorised!
                        //Page loads as normal.
                    }
                    else
                    {
                        Unauthorised();
                    }
                }
                else
                {
                    Unauthorised();
                }
            }
    
            private void Unauthorised()
            {
                Response.AddHeader("WWW-Authenticate", "Basic");
                Response.Status = "401 Unauthorized";
                Response.End();
            }
        }
    }
    

    【讨论】:

    • 这会危及安全吗?
    【解决方案2】:

    由于您有一个自定义的用户数据库,我建议您快速构建一个与您的数据库架构对话的membership provider

    MSDN 在"How to: Sample Membership Provider" 上有一个很好的例子。

    然后,您可以使用 standard access control mechanisms of ASP.NET 锁定页面、要求身份验证等,并使用 LoginLoginStatus 等控件来提供您需要的大部分 UI。


    编辑以添加

    快速search 发现以下内容,可能有帮助:

    Web Service Security - Basic HTTP Authentication without Active Directory

    Greg Reinacker 展示了“一个完整的 100% 托管代码示例,演示了 HTTP 基本身份验证的使用,使用单独的凭据存储(在本例中为 XML 文件,尽管这很容易更改为数据库或LDAP 存储)。”

    【讨论】:

    • 我在这里可能是错的,但这不是依赖于表单样式的身份验证,例如,请求页面将用户带到登录页面,然后再返回原始页面。问题是,这在 Excel 中是不可能的,这就是为什么我需要它来使用 HTTP Auth,例如 Basic Authentication。
    • 啊,我明白你的意思了,但是你在没有 Windows 用户的情况下被困住了——正如 serialhobbyist 指出的那样,Basic Auth 使用的是什么。
    • 我已经看到了一些使用 HttpModule 在 IIS 之外实现基本身份验证的可能用途。如果我有任何成功,我会在这里发布。
    • 是的,这似乎也是我发现的。
    • @JoelB 基本身份验证does rely on Windows“IIS 使用 Windows 用户帐户实现基本身份验证,它是 HTTP 1.0 规范的一部分。”
    【解决方案3】:

    我不是专家,但我认为 Basic 的意义在于它是 Windows 身份验证。您可以运行一个脚本来将您的数据库用户与您的 Active Directory 同步吗?

    如果是企业 AD,您可以考虑为您的应用创建第二个 AD,并同步企业 AD 和数据库中的用户。如果您不需要同步密码(例如,在您的站点中构建 pwd-mgmt 页面),您可以只使用脚本或 C# 或其他东西。如果您想要更复杂的内置密码同步功能,可以查看 ILM 2007(即将成为 FIM 2010)。

    【讨论】:

    • 这个问题是我无法知道任何现有用户的密码是什么。它们都是盐渍和散列等。
    • 如果您将同步方法放在适当的位置(在后台),然后使所有密码过期,以便用户必须设置新密码,该怎么办?
    【解决方案4】:

    页面是 .html 文件还是 .aspx 文件? 如果是 .aspx,您应该保持此页面处于匿名访问状态,并在页面逻辑本身中检查身份验证

    【讨论】:

    • 这是一个 ASPX 页面,因此我可以编写任何所需的 .net/c# 代码。但是,是否可以匿名通过 IIS,然后仍然执行自定义 HTTP Auth 样式身份验证?你有这方面的例子吗?
    • 我不确定我是否理解您的问题。您说“所有身份验证/安全性都使用我们的应用程序本身进行管理。”所以我假设一旦用户登录,就会启动一个 Session 变量,对吧?在页面顶部检查该变量,如果未设置,则重定向到“login.aspx”
    • 该页面由 Excel 访问... Excel 不知道如何处理重定向到 Login.aspx 的页面。
    • 好的,然后不重定向,只需返回一个字符串“请在访问此页面之前登录”。我希望 Excel 可以显示...
    【解决方案5】:

    我编写了一个名为 FSCAuth 的库,它可能会对此有所帮助。它可以简单地设置为没有 Active Directory 的基本身份验证。相反,它会从数据库/文件/任何地方读取您的用户数据(甚至还有一个仅限内存的 UserStore)

    它是 BSD 许可的 at Binpress

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 2012-10-06
      • 1970-01-01
      • 2020-06-24
      • 2022-01-09
      • 2021-02-07
      • 2012-04-07
      • 2019-01-28
      相关资源
      最近更新 更多