Domanda

Questo potrebbe sembrare una domanda di base e di nuovo al protocollo HTTP 101. Ma io sto avendo difficoltà a capire come funziona l'autenticazione di base. Io sono l'attuazione di un servizio di Windows e bisogno di essere sicuro. Vorrei ottenere il nome utente e la password e autenticare l'utente a un negozio di utente personalizzato. Voglio anche per ridurre al minimo il numero di chiamate d'accesso, come una chiamata di accesso rappresenta una chiamata al nostro server SQL. Quello che ho iniziato finora è qualcosa di simile:

Il mio modo di vedere la funzione UserAuthorized deve fare la mia chiamata di accesso personalizzato. Ma, io non voglio avere a che fare che ogni singola volta. Ha l'autenticazione di base mantenere se si è effettuato l'accesso, o c'è un filo di caching soluzione sicura che avrei dovuto esplorare.

Oh sì mi piacerebbe anche fare in modo che quando un utente è l'autenticazione e l'oggetto viene creato e mantenuto nel thread per l'ascoltatore a fare riferimento a su callback successive per un utente / collegamento. Ma dal momento che ListenerCallback è statico non sono sicuro di come questo possa essere realizzato.

Grazie in anticipo per qualsiasi aiuto, ho veramente apprezzato e 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;
    }            
}

Modifica +1 per il documento da solo, che in realtà ha aperto gli occhi per la gualdrappa di schemi di autenticazione e come funzionano. A meno che un preparava questo torto, in quanto sembra che un regime Digest potrebbe essere in grado di mantenere una "sessione", o almeno una scadenza per ritentare la mia autenticazione personalizzato.

È stato utile?

Soluzione 2

Grazie per la spec, ho apprezzato. Sono riuscito a risolvere il mio problema e non era spec relativa, ma piuttosto un progetto / problema di hosting.

Altri suggerimenti

HTTP di base richiede le credenziali di accesso di ogni richiesta. HTTP non ha alcun concetto di sessione, quindi non si può davvero dire se qualcuno sta "già connesso".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top