这似乎是一个基本问题,并回到Http协议101.但我很难理解基本身份验证的工作原理。我正在实现一个Windows服务,需要它是安全的。我想获取用户名和密码,并将用户身份验证到自定义用户存储。我还想最小化登录呼叫的数量,因为登录呼叫代表对我们的SQL服务器的调用。到目前为止我开始的是这样的:
我看到UserAuthorized函数的方式必须进行自定义登录调用。但是,我不想每次都这样做。如果您已登录,基本身份验证是否会保持,或者是否存在我应该探索的缓存线程安全解决方案。
哦,是的,我也希望这样做,以便当用户进行身份验证并在线程中创建和维护对象,以便侦听器在后续的用户/连接回调中引用。但由于ListenerCallback是静态的,我不确定如何实现。
在此先感谢您的帮助,我非常感谢它和StackOverflow。
public void ThreadProc() {
string uriPrefix = ConfigurationManager.AppSettings["ListenerPrefix"];
HttpListener listener = new HttpListener();
listener.Prefixes.Add(uriPrefix);
listener.AuthenticationSchemes = AuthenticationSchemes.Basic;
listener.Start();
Console.WriteLine("Start listening on " + uriPrefix);
Console.WriteLine("Press Control-C to stop listener...");
while (listening) {
IAsyncResult result = listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
result.AsyncWaitHandle.WaitOne();
}
}
public static void ListenerCallback(IAsyncResult result) {
HttpListener listener = (HttpListener)result.AsyncState;
HttpListenerContext context = listener.EndGetContext(result);
WebDavEngine engine = new WebDavEngine(context.User);
context.Response.SendChunked = false;
FileLogger.Level = LogLevel.Debug;
engine.IgnoreExceptions = false;
if (UserAutorized(context)) {
try {
engine.Run(context, listener.Prefixes);
engine.CommitTransaction();
} catch {
engine.RollBackTransaction();
} finally {
engine.CloseConnection();
}
} else
context.Response.StatusCode = 401;
if (context.Response.StatusCode == 401)
ShowLoginDialog(context, context.Response);
try {
context.Response.Close();
} catch {
// client closed connection before the content was sent
}
}
private static bool UserAutorized(HttpListenerContext context) {
HttpListenerBasicIdentity identity = (HttpListenerBasicIdentity)context.User.Identity;
if (!identity.IsAuthenticated) {
string username = identity.Name;
// workaround for Windows Vista Basic authentication. User name may be submitted in the following format: Machine\User.
int ind = username.LastIndexOf('\\');
if (ind > 0)
username = username.Remove(0, ind + 1);
Console.WriteLine("Trying Authentication since identity is NOT authenticated");
return false;
} else {
Console.WriteLine("identity.IsAuthenticated: " + identity.IsAuthenticated.ToString());
return identity.IsAuthenticated;
}
}
编辑:单独为文档+1,这真的让我看到了身份验证方案及其工作原理。除非我准备好这个错误,否则似乎摘要方案可能能够维持“会话”或至少到期以重试我的自定义身份验证。
答案 0 :(得分:4)
HTTP Basic需要每个请求的登录凭据。 HTTP没有任何会话概念,因此您无法确定某人是否“已登录”。
答案 1 :(得分:0)
感谢您的规范,我很感激。我确实设法解决了我的问题,这不是规范相关,而是设计/托管问题。