【发布时间】:2011-08-04 18:55:18
【问题描述】:
我在为 .net 4.0 中的 asmx 实现自定义基本身份验证时遇到了一个小问题。 我创建了 HttpModule,它将启动运行此代码的 Web 服务使用者的身份验证过程,
HttpApplication application = (source as HttpApplication);
HttpContext context = application.Context;
if ( VirtualPathUtility.GetFileName(context.Request.FilePath).Contains("svcEWS.asmx"))
{
string username = "", password = "";
string authHeader = HttpContext.Current.Request.Headers["Authorization"];
if (!string.IsNullOrEmpty(authHeader) && authHeader.StartsWith("Basic"))
{
//Authenticate here
}
}
但是,只要达到此代码,就没有身份验证标头。 消费网络应用只是简单地调用,
EWS.svcEWS svcEWS = new EWS.svcEWS();
svcEWS.Credentials = new NetworkCredential("admin", "admin", "example.com");
svcEWS.HelloWorld();
IIS 设置为使用匿名身份验证运行匿名身份验证,以防止它捕获任何身份验证请求。
我是否缺少让客户端将正确的标头传递给我的模块的东西?
【问题讨论】:
-
Microsoft 已经提供了一种自定义 Web 服务身份验证的方法。它被称为WCF! ASMX 不打算以这种方式进行定制。不要浪费时间重新发明轮子。
-
我同意,但是在我的特殊情况下,我正在模仿一个预先存在的网络服务,并且无法控制使用它的客户端。
-
已解决。问题是我忘记对失败的身份验证请求响应 401 以强制标头。
-
很高兴您解决了问题,但是在 WCF 中自定义安全性要比使用 HttpModule 并与文件路径进行比较要干净得多。
-
您应该添加一个答案,显示您如何更改代码以使其正常工作,然后(一旦Stack Overflow 允许您),您应该接受自己的答案。
标签: web-services authentication http-headers basic-authentication