ASP.Net - 在没有Windows用户的情况下使用基本身份验证

时间:2009-12-11 11:00:46

标签: asp.net iis authentication

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

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

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

我们需要为此页面添加安全性,以便这些电子表格落入坏人手中,然后在不提供用户名/密码的情况下无法“刷新”数据。

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

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

有人有任何想法吗?是否有可能让IIS在其他地方寻找基本身份验证?

5 个答案:

答案 0 :(得分:11)

好的,所以我找到了两个解决这个问题的方法。非常感谢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();
        }
    }
}

答案 1 :(得分:5)

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

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

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


编辑以添加

快速search找到以下内容,可能帮助:

  

Web Service Security - Basic HTTP Authentication without Active Directory

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

答案 2 :(得分:1)

我不是专家,但我认为Basic的重点是它是Windows身份验证。您是否可以运行脚本以将数据库用户与Active Directory同步?

如果是公司广告,您可以考虑为您的应用添加第二个广告,并同步公司广告和数据库中的用户。如果您不需要同步密码(例如,在您的站点中构建一个pwd-mgmt页面),您可以使用脚本或C#等。如果您想要内置密码同步更复杂的东西,可以查看ILM 2007(很快将成为FIM 2010)。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我写了一个名为FSCAuth的库,可能对此有所帮助。它可以简单地设置为不使用Active Directory进行基本身份验证。它将改为从数据库/文件/中读取您的用户数据(甚至只有一个内存的UserStore)

获得BSD许可at Binpress