Question

Cela peut sembler une question fondamentale et revenir au protocole Http 101. Mais je vais avoir du mal à comprendre comment fonctionne l'authentification de base. J'Implémenter un service de fenêtres et besoin d'être sécurisé. Je voudrais obtenir le nom d'utilisateur et mot de passe et d'authentifier l'utilisateur à un magasin d'utilisateur personnalisé. Je tiens également à réduire le nombre d'appels de connexion, comme un appel de connexion représente un appel à notre serveur SQL. Ce que j'ai commencé à ce jour est quelque chose comme ceci:

La façon dont je vois la fonction UserAuthorized doit faire mon appel de connexion personnalisée. Mais, je ne veux pas avoir à faire à chaque fois. Est-ce que l'authentification de base maintenir si vous êtes connecté, ou est-il un fil de mise en mémoire cache solution sûre que j'explorer.

Oh ouais je voudrais aussi faire en sorte que lorsqu'un utilisateur est l'authentification et de l'objet est créé et maintenu dans le fil pour l'auditeur de se référer à la suite de rappels pour un utilisateur / connexion. Mais puisque ListenerCallback est statique Je ne sais pas comment cela peut être accompli.

Merci d'avance pour toute aide, je l'apprécie vraiment et 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 pour le seul document, qui m'a vraiment ouvert les yeux sur le caparaçon des systèmes d'authentification et comment ils fonctionnent. À moins que je une mauvaise ce prépare, il ne semble qu'un système Digest pourrait être en mesure de maintenir une « session » ou au moins une expiration pour une nouvelle tentative de mon authentification personnalisée.

Était-ce utile?

La solution 2

Merci pour la spécification, je l'ai apprécié. J'ai réussi à résoudre mon problème et il n'a pas été spec connexes, mais plutôt une conception / problème d'hébergement.

Autres conseils

HTTP de base nécessite les informations de connexion à chaque demande. HTTP n'a pas de concept de session, de sorte que vous ne pouvez pas vraiment dire si quelqu'un est « déjà connecté ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top