English 中文(简体)
ASP.NET Web服务在.NET 3.5/VS 2008上的自定义HTTP基本认证
原标题:
  • 时间:2009-01-29 06:06:57
  •  标签:

我正在对一个工作中的ASP.NET Web应用程序进行重构,以使用ASP.NET Web服务公开Web服务接口。根据Web服务身份验证-最佳实践,Basic Auth通过https是正确的路线。让我们假设它是正确的选择,而不是使用WS-Security、X509等。

在.NET 3.5/VS 2008上,实现自定义的HTTP基本认证(非Windows账户)最简单的方法是什么,例如,只接受用户名为“foo”且密码为“bar”的用户。最终,我希望Thread.CurrentPrincipal被设置。

我需要编写自己的HttpModule吗?还是有更简单的方法?

最佳回答

使用由Dominick Baier编写的Custom Basic Authentication for IIS可能是正确的选择。正如他所指出的那样,WCF 3.5中的用户名在传输安全性方面不能在IIS托管的服务上使用,尽管我的问题关于ASP.NET Web Services而不是WCF。

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

虽然它不是我想要的,但我发现快速入门教程中的SOAP标头示例很有启发性。以纯文本形式通过http发送密码显然是不安全的,但是可以扩展此示例以增加更多安全性,例如在https上运行或发送“密码+一次性GUID+时间戳”的哈希值。

问题回答

获取Authorization头的值,解析并验证用户名/密码。

该值是用户名:密码,编码为Base64字符串。

详情请参见http://en.wikipedia.org/wiki/Basic_access_authentication

编辑:如果您想让每个请求都使用自定义身份验证方案来完成此操作,则编写一个HttpModule来处理解析标题并设置线程主体会更容易。

如果您正在考虑使用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;
}




相关问题
热门标签