C# 在dotnetnuke模块中具有ASMX web服务
我已经实现了一个工作正常的DNN模块。现在,我的雇主想让我把一些特性公开为web服务。我想让一切保持干净和简单,所以我决定在我的模块中添加一个asmx web服务 web服务本身工作正常,但当我试图添加一个HttpModule来处理请求身份验证时,一切都搞砸了 我有一个AuthenticateRequest的事件处理程序,如下所示:C# 在dotnetnuke模块中具有ASMX web服务,c#,asp.net,web-services,dotnetnuke,dotnetnuke-module,C#,Asp.net,Web Services,Dotnetnuke,Dotnetnuke Module,我已经实现了一个工作正常的DNN模块。现在,我的雇主想让我把一些特性公开为web服务。我想让一切保持干净和简单,所以我决定在我的模块中添加一个asmx web服务 web服务本身工作正常,但当我试图添加一个HttpModule来处理请求身份验证时,一切都搞砸了 我有一个AuthenticateRequest的事件处理程序,如下所示: private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
{
var app = sender as HttpApplication;
if (app == null || !(app.Request.Url.ToString().EndsWith("WebServices.asmx"))) return;
var request = app.Request;
var authHeader = request.Headers["Authorization"];
if (authHeader != null)
{
var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
// RFC 2617 sec 1.2, "scheme" name is case-insensitive
if (authHeaderVal.Scheme.Equals("basic",
StringComparison.OrdinalIgnoreCase) &&
authHeaderVal.Parameter != null)
{
AuthenticateUser(authHeaderVal.Parameter);
}
}
else
{
HttpContext.Current.Response.StatusCode = 401;
}
}
以下是客户端:
var service = new localhost.WebServices();
var credentialsCache = new CredentialCache
{
{new Uri(service.Url), "Basic", new NetworkCredential("user", "password")}
};
service.Credentials = credentialsCache;
Console.WriteLine(service.HelloWorld());
问题是没有授权头以这种方式添加到我的请求中。我搜索了一下,发现这里有一个循环,头不是第一次添加的,如果响应有一个基本的授权头,另一个请求将与头一起发送。因此,我添加了else部分:
else
{
HttpContext.Current.Response.StatusCode = 401;
}
和EndRequest处理程序:
private static void OnApplicationEndRequest(object sender, EventArgs e)
{
var response = HttpContext.Current.Response;
if (response.StatusCode == 401)
{
response.Headers.Add("WWW-Authenticate",
string.Format("Basic realm=\"{0}\"", Realm));
}
}
现在每次我发送请求,我都会被重定向到登录页面!!!我知道发生这种情况是因为存在另一个FormAuthentication HttpModule,如果StatusCode为401,它会将请求重定向到登录页面
请告诉我我做错了什么?有没有办法防止其他HttpModule干扰我的响应
更新
我将PreAuthenticate属性设置为true,但仍然没有发送授权标头请参见,如果一致意见为否,则不应发送!这不是一个标记:这显示了问题的范围。我的意思是,我不是说一般的web服务,而是在dotnetnuke模块中。你最好将范围添加到你的问题中,而不是像上次编辑那样使用标记-title这样的标记样式