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

问题描述:

我们有一个在IIS6上运行的ASP.Net Web应用程序,它管理自己的用户数据库。ASP.Net - 在没有Windows用户的情况下使用基本身份验证

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

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

我们需要为此页面添加安全性,以便在这些电子表格落入错误的手中时,如果不提供用户名/密码,数据将无法“刷新”。

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

问题是我需要能够基于我们的数据库中的用户来保护此页面,并且他们不会是Windows用户。我还需要这样做,使Excel可以管理排除任何基于表单的身份验证的身份验证。

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

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

这是否会危及安全? – Joyce 2015-03-20 12:36:54

我不是专家,但我认为基本点是它是Windows身份验证。你能运行一个脚本来同步你的数据库用户和Active Directory吗?

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

+0

这样做的问题是,我没有办法知道什么任何现有的用户密码都是。他们都被盐渍和散列等 – 2009-12-11 11:46:51

+0

如果你把你的同步方法(在后台),然后到期的所有密码,以便用户必须设置新的? – serialhobbyist 2009-12-12 13:17:52

页面是.html文件还是.aspx文件? 如果它是一个.aspx,你应该保持匿名访问该页面,并在页面逻辑本身检查认证

+0

这是一个ASPX页面,所以我可以编写它所需的任何.net/c#代码。但是,是否有可能以匿名方式通过IIS,然后仍然执行自定义HTTP身份验证样式身份验证?你有这样的例子吗? – 2009-12-11 11:51:49

+0

我不确定我了解你的问题。你说过“所有认证/安全性都是使用我们的应用程序本身来管理的。所以我假设用户登录后会有一个Session变量被启动,对吧? 在页面顶部检查变量,如果没有设置,重定向到“login.aspx” – SergeyKazachenko 2009-12-11 14:46:48

+1

该页面被Excel访问... Excel不知道如何处理重定向到Login.aspx的页面。 – 2009-12-11 15:40:04

正如你已经有了用户的自定义数据库,我建议你在寻找建立快速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

当格雷格Reinacker提出了“一个完全工作样品在100%米这些代码演示了使用HTTP基本认证,使用单独的凭证存储(在这种情况下,这是一个XML文件,虽然这将很容易更改为数据库或LDAP存储)。“

+0

我可能在这里是错误的,但是这不会依赖于Forms风格的身份验证,例如,在返回到原始页面之前请求页面首先将用户带到登录页面。问题是,这是不可能从Excel这就是为什么我需要它使用HTTP身份验证,例如,基本身份验证。 – 2009-12-11 12:03:10

+0

啊,我明白你的意思了,但是你没有被windows用户卡住 - 这正如serialhobbyist指出的那样,Basic Auth使用什么。 – 2009-12-11 12:17:51

+0

我见过一些HttpModule的可能用途来实现IIS以外的基本身份验证。如果我有任何成功,我会在这里发布。 – 2009-12-11 12:24:19

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

这是BSD许可at Binpress