Pergunta

Isto pode parecer uma pergunta básica e de volta para o protocolo HTTP 101. Mas eu estou tendo dificuldade em compreender como autenticação básica funciona. Estou implementando um serviço do Windows e precisa que ele seja seguro. Gostaria de obter o nome de usuário e senha e autenticar o usuário a uma loja de usuário personalizada. Eu também quero minimizar o número de chamadas de login, como uma chamada de login representa uma chamada para o nosso servidor SQL. O que eu comecei até agora é algo como isto:

A forma como eu vejo a função UserAuthorized tem que fazer minha chamada de login personalizado. Mas, eu não quero ter que fazer isso a cada momento. Será que a autenticação básica manter, se você estiver logado, ou há uma solução segmento seguro caching que eu deveria explorar.

Oh sim, eu também gostaria de fazê-lo de modo que quando um usuário é autenticar e objeto é criado e mantido no segmento para o ouvinte para se referir a em retornos de chamada subseqüentes para um usuário / conexão. Mas desde ListenerCallback é estático Eu não sei como isso pode ser feito.

Agradecemos antecipadamente por qualquer ajuda, eu realmente apreciá-lo 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;
    }            
}

EDIT: +1 para o documento sozinho, que realmente abriu meus olhos para o caparison de esquemas de autenticação e como eles funcionam. A menos que eu a preparava esta errado, parece que um esquema Digest pode ser capaz de manter uma "sessão" ou pelo menos uma expiração para repetir a minha autenticação personalizada.

Foi útil?

Solução 2

Obrigado pela especificação, apreciei isso. Eu consegui resolver o meu problema e não foi especificação relacionada mas sim um projeto / problema de hospedagem.

Outras dicas

HTTP Básico requer as credenciais de login com cada pedido. HTTP não tem qualquer conceito de sessão, então você não pode realmente dizer se alguém está "já registrado em".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top