Frage

Dies mag wie eine grundlegende Frage scheint und zurück zu Http-Protokoll 101. Aber Ich habe Schwierigkeiten zu verstehen, wie die Standardauthentifizierung funktioniert. Ich bin der Umsetzung einen Windows-Dienst und müssen es sicher sein. Ich möchte den Benutzernamen und das Passwort erhalten und um den Benutzer zu einem benutzerdefinierten Benutzerspeicher authentifizieren. Ich möchte auch die Anzahl der Login-Anrufe zu minimieren, wie ein Login Anruf um einen Anruf zu unserem SQL-Server darstellt. Was ich bis jetzt ist so etwas wie dies gestartet:

So wie ich es die UserAuthorized Funktion sehen muss meinen benutzerdefinierten Login-Anruf tätigen. Aber ich will nicht, dass jede einzelne Zeit zu tun haben. Ist die Standardauthentifizierung pflegen, wenn Sie eingeloggt sind, oder gibt es eine Cache-Thread sichere Lösung, die ich erforschen soll.

Oh ja, ich würde es auch gerne machen, so dass, wenn ein Benutzer authentifizieren und Objekt wird in dem Thread erstellt und gepflegt für die Zuhörer auf spätere Rückrufe beziehen sich auf für einen Benutzer / Verbindung. Aber da ListenerCallback statisch ist, ich bin nicht sicher, wie dies erreicht werden kann.

Vielen Dank im Voraus für jede Hilfe, ich schätze es wirklich und 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;
    }            
}

EDIT: 1 für das Dokument allein, die wirklich meine Augen an die caparison von Authentifizierungsschemata geöffnet und wie sie funktionieren. Es sei denn, ich das falsch ein readying, es scheint, dass ein Digest-Schema eine „Sitzung“ oder zumindest einen Ablauf zu halten möglicherweise in der Lage zu meiner benutzerdefinierten Authentifizierung zu wiederholen.

War es hilfreich?

Lösung 2

Danke für die Spezifikation, ich schätzte sie. Ich habe es geschafft, mein Problem zu lösen, und es wurde nicht spez bezogen, sondern ein Design / Hosting-Ausgabe.

Andere Tipps

HTTP Basic erfordert die Anmeldeinformationen bei jeder Anfrage. HTTP hat kein Konzept der Sitzung, so dass man nicht wirklich sagen kann, ob jemand „bereits angemeldet“ ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top