Pregunta

Esto puede parecer una pregunta básica y de vuelta al protocolo HTTP 101. Pero tengo dificultades en la comprensión de cómo funciona la autenticación básica. Me estoy poniendo en práctica un servicio de Windows y necesita que sea seguro. Me gustaría obtener el nombre de usuario y contraseña y autenticar al usuario en un almacén de usuario personalizada. También quiero minimizar el número de llamadas de inicio de sesión, como una llamada de inicio de sesión representa una llamada a nuestro servidor SQL. Lo que he empezado hasta ahora es algo como esto:

A mi modo de ver la función UserAuthorized tiene que tomar mi llamada de inicio de sesión personalizado. Pero, yo no quiero tener que hacer eso cada vez. ¿Mantiene la autenticación básica si está en el sistema, o hay una solución segura hilo de almacenamiento en caché que debería explorar.

Oh sí también me gustaría hacerlo de modo que cuando un usuario se autentique y el objeto es creado y mantenido en el hilo para que el oyente se refiere a las devoluciones de llamada en posteriores para un usuario / conexión. Pero desde ListenerCallback es estática No estoy seguro de cómo esto se puede lograr.

Gracias de antemano por cualquier ayuda, realmente lo aprecio y 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 el documento solo, que me abrió los ojos a la caparazón de esquemas de autenticación y cómo funcionan. A menos que un preparándose esto mal, parece que un esquema Digesto podría ser capaz de mantener una "sesión" o por lo menos una caducidad para volver a intentar mi autenticación personalizado.

¿Fue útil?

Solución 2

Gracias por la especificación, he apreciado ella. Me las arreglé para resolver mi problema y no estaba relacionado spec sino más bien un / problema de alojamiento de diseño.

Otros consejos

HTTP básico requiere las credenciales de acceso con cada petición. HTTP no tiene ningún concepto de sesión, así que realmente no se puede saber si alguien está "ya haya iniciado sesión".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top