如何使用VS调试服务器实现基本的HTTP身份验证
本文关键字:HTTP 身份验证 实现 何使用 VS 调试 服务器 | 更新日期: 2023-09-27 18:19:52
我正在为ActiveX HTTP控件制作一个测试平台,我需要创建一个网站来安全地POST到。为了简单起见,我正在使用VS调试服务器运行web应用程序;web应用程序项目是测试应用程序解决方案的一部分。AX控件不支持NTLM身份验证。有没有什么简单的方法可以在不使用NTLM或重定向到页面表单的情况下要求非常基本的http身份验证?我只需要它在发布过程中需要一个用户名和密码。用户名和密码内容无关紧要,因此所有内容都将以明文形式存储。
我已经在Web.Config中尝试了身份验证模式;Windows似乎与NTLM完全相同(可能是错误的),Forms需要一个表单来连接并设置cookie,Passport超出了该项目的范围,我不知道如何实现None。有什么想法吗?
我在Web.Config中尝试了"身份验证模式="Windows",并选中了Web应用程序"Web"选项卡中的NTLM复选框。
您可以使用ASP.NET实现自己的基本HTTP身份验证。这似乎不是一个非常复杂的规范,但有关所有详细信息,请参阅RFC1945。
如果必须这样做,我会从HttpModule
开始,它在每个请求上运行,并检查HTTP标头HTTP_AUTHORIZATION
。如果它是基本身份验证的头,那么您可以解码用户名和密码。如果标头丢失或用户名和密码不正确,则返回HTTP 401响应并添加WWW-Authenticate
标头。
像这样的东西(没有测试,但你明白了):
public class BasicAuthenticationModule: IHttpModule
{
public void Init(HttpApplication application)
{
application.AuthenticateRequest += new EventHandler(Do_Authentication);
}
private void Do_Authentication(object sender, EventArgs e)
{
var request = HttpContext.Current.Request;
string header = request.Headers["HTTP_AUTHORIZATION"];
if(header != null && header.StartsWith("Basic "))
{
// Header is good, let's check username and password
string username = DecodeFromHeader(header, "username");
string password = DecodeFromHeader(header, password);
if(Validate(username, password)
{
// Create a custom IPrincipal object to carry the user's identity
HttpContext.Current.User = new BasicPrincipal(username);
}
else
{
Protect();
}
}
else
{
Protect();
}
}
private void Protect()
{
response.StatusCode = 401;
response.Headers.Add("WWW-Authenticate", "Basic realm='"Test'"");
response.Write("You must authenticate");
response.End();
}
private void DecodeFromHeader()
{
// Figure this out based on spec
// It's basically base 64 decode and split on the :
throw new NotImplementedException();
}
private bool Validate(string username, string password)
{
return (username == "foo" && pasword == "bar");
}
public void Dispose() {}
public class BasicPrincipal : IPrincipal
{
// Implement simple class to hold the user's identity
}
}
michielvoo的答案很好,但为了简单起见,我在页面代码中使用了这个:
string authorization = Request.Headers["Authorization"];
string userInfo;
string username = "";
string password = "";
if (authorization != null)
{
byte[] tempConverted = Convert.FromBase64String(authorization.Replace("Basic ", "").Trim());
userInfo = System.Text.Encoding.UTF8.GetString(tempConverted);
string[] usernamePassword = userInfo.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
username = usernamePassword[0];
password = usernamePassword[1];
}
if (username == "yourusername" && password == "yourpassword")
{
}
else
{
Response.AddHeader("WWW-Authenticate", "Basic realm='"Test'"");
Response.StatusCode = 401;
Response.End();
}