.NET 3.5/VS 2008 上 ASP.NET Web 服务的自定义 HTTP 基本身份验证

Posted

技术标签:

【中文标题】.NET 3.5/VS 2008 上 ASP.NET Web 服务的自定义 HTTP 基本身份验证【英文标题】:Custom HTTP Basic Authentication for ASP.NET Web Services on .NET 3.5/VS 2008 【发布时间】:2010-10-04 04:30:06 【问题描述】:

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

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

我是自己写HttpModule 还是更简单些?

【问题讨论】:

【参考方案1】:

可能使用Custom Basic Authentication for IIS,由Dominick Baier 编写是要走的路。 As he points out WCF 3.5 的传输安全用户名不能用于 IIS 托管服务,尽管我的问题是关于 ASP.NET Web 服务而不是 WCF。

Santosh Sahoo 的另一个 HTTP 模块实现称为 Basic authentication in ASP.NET against custom datasource。

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

我想要 http 标头中的用户和密码,而不是 SOAP 标头。此外,通过传输的用户名在 IIS 上也不起作用:leastprivilege.com/WCFUsernamesOverTransportAndIISHosting.aspx usernameOverTransport for basicHttpBinding 甚至可以在 IIS 中托管,我已经将解决​​方案部署到生产环境中。请记住,在 IIS 中配置的不是基本身份验证。它处于肥皂消息级别。

以上是关于.NET 3.5/VS 2008 上 ASP.NET Web 服务的自定义 HTTP 基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

缩放 ASP.NET 应用程序

ASP.NE网站发布注意事项

跟我学ASP.NET MVC之十一:URL路由

理解ASP.NET Core

ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据

在 WPF、Silverlight 和 ASP.NET 之间共享一个公共 DAL