10

我正在重构一个工作的 ASP.NET Web 应用程序以使用 ASP.NET Web 服务公开 Web 服务接口。根据Web 服务身份验证 - 最佳实践,通过 https 的基本身份验证是可行的方法。让我们假设它是,而不是做 WS-Security、X509 等。

在 .NET 3.5/VS 2008 上,实现自定义 http 基本身份验证(非 Windows 帐户)的最简单方法是什么,例如,仅当用户名为“foo”且密码为“bar”时才接受。最终,我想Thread.CurrentPrincipal设置。

我自己写HttpModule还是可以更简单地完成?

4

3 回答 3

5

可能使用IIS 的自定义基本身份验证,由Dominick Baier编写是要走的路。正如他指出的那样, WCF 3.5 的传输安全用户名不能用于 IIS 托管服务,尽管我的问题是关于 ASP.NET Web 服务而不是 WCF。

在 ASP.NET 中有另一种 HTTP 模块实现,称为基本身份验证,Santosh Sahoo针对自定义数据源。

虽然这不是我想要的,但我发现QuickStart Tutorial 的 SOAP Headers 示例提供了丰富的解决方法。通过 http 以纯文本形式发送密码显然是不安全的,但可以扩展此示例以增加安全性,例如在 https 上运行或发送“密码 + 一次性 GUID + 时间戳”的哈希。

于 2009-02-11T00:04:10.803 回答
3

获取标头的值,对其进行Authorization解析并验证用户名/密码。

值为 username:password,编码为 Base64 字符串。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Basic_access_authentication

编辑:如果您希望使用自定义身份验证方案为每个请求完成此操作,那么编写一个HttpModule来处理解析标头和设置线程的主体会更容易。

于 2009-02-04T05:48:29.300 回答
1

如果您正在考虑 WCF,则可以对 basicHttpBinding 使用 usernameOverTransport 安全性。即用户名和密码位于请求的 SOAP 标头中,所有流量都受到 SSL 在线加密的保护。

自定义 UserNamePasswordValidator 验证器可用于针对例如数据库验证传入凭据。

您可以在服务行为的自定义 IAuthorizationPolicy 中设置线程主体。

例如,评估 IAuthorizationPolicy 的方法实现以设置当前主体

public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
       Object obj;
       if( evaluationContext.Properties.TryGetValue( "Identities", out obj ))
       {
            // get the authenticated identity
            IIdentity client = (obj as IList<IIdentity>)[0];
            evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity
            // this will set thread's current principal
       }
       return true;
}
于 2009-01-29T08:59:46.443 回答