none
Problema con WEB API con [Authorize] RRS feed

  • Pregunta

  • Hola gente:

    Estoy desarrollando un web Service WEBAPI que se conecta con una base de datos sql server que tiene la estructura típica que genera mvc-aspx ( tabla de aspnetuser, aspnetroles,etc)

    Quiero que el servicio este un *protegido* con autentificación básica (usuario y contraseña de la tabla aspnetuser). Se los problemas de seguridad, la idea es ponerlo luego en un https.

    Conoceis de alguna web donde expliquen como hacerlo?

    Yo he encontrado una y la he adaptado a mis necesidades y no me va, esta es la clase que utilizo:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http.Headers;
    using System.Security.Principal;
    using System.Text;
    using System.Threading;
    using System.Web;
    using Microsoft.AspNet.Identity;
    using Microsoft.AspNet.Identity.EntityFramework;
    using Microsoft.AspNet.Identity.Owin;
    
    using Microsoft.Owin;
    using ServicioProx360.Models;
    using ServicioProx360;
    
    
    namespace Seguridad.Modules
    	{
    	public class J2AuthHttpModule : IHttpModule
    		{
    		private const string Realm = "WebAPI Authentication";
    
    		public void Init(HttpApplication context)
    			{
    			// Se registran los manejadores de los eventos
    			context.AuthenticateRequest += OnApplicationAuthenticateRequest;
    			context.EndRequest += OnApplicationEndRequest;
    			}
    
    		private static void SetPrincipal(IPrincipal principal)
    			{
    			Thread.CurrentPrincipal = principal;
    			if (HttpContext.Current != null)
    				{
    				HttpContext.Current.User = principal;
    				}
    			}
    
    		private static bool AuthenticateUser(string credentials)
    			{
    			var encoding = Encoding.GetEncoding("iso-8859-1");
    			credentials = encoding.GetString(Convert.FromBase64String(credentials));
    
    			var credentialsArray = credentials.Split(':');
    			var username = credentialsArray[0];
    			var password = credentialsArray[1];
    
    			OwinContext context = new OwinContext();
    
    //			var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>()));
    			var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));
    
    			ApplicationUser usuario = manager.Find(username, password);
    			/* Aquí se validan las credenciales o el token enviado en el encabezado de la solicitud */
    //			if (!(username == "test" && password == "test"))
    			if (usuario==null)
    				{
    				return false;
    				}
    			
    			var identity = new GenericIdentity(usuario.UserName);
    			
    			SetPrincipal(new GenericPrincipal(identity, new string[] { "CIUDADADNO" }));
    
    			return true;
    			}
    
    		private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
    			{
    			var request = HttpContext.Current.Request;
    			var authHeader = request.Headers["Authorization"];
    			if (authHeader != null)
    				{
    				var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
    
    				// Se valida si el esquema de autenticación es básico (Basic Authentication)
    				if (authHeaderVal.Scheme.Equals("basic", StringComparison.OrdinalIgnoreCase) && authHeaderVal.Parameter != null)
    					{
    					AuthenticateUser(authHeaderVal.Parameter);
    					}
    				}
    			}
    
    		// Si la solicitud no fue aprobada, se agrega el encabezado WWW-Authenticate a la respuesta
    
    		private static void OnApplicationEndRequest(object sender, EventArgs e)
    			{
    			var response = HttpContext.Current.Response;
    			if (response.StatusCode == 401)
    				{
    				response.Headers.Add("WWW-Authenticate", string.Format("Basic realm=\"{0}\"", Realm));
    				}
    			}
    		public void Dispose()
    			{
    			}
    		}
    	}

    Cuando hago una petición que no es [authorize] funciona bien, pero cuando le pongo el [authorize] continuamente pide el usuario y contraseña, y aunque lo pongas bien y conecte con la base de datos, recupera los datos bien, pero vuelve a pedir el usuario y contraseña.

    Si se os ocurre por que?

    Muchas gracias



    Juanjo


    • Editado Juanjo_16v sábado, 22 de abril de 2017 16:21
    sábado, 22 de abril de 2017 16:04

Todas las respuestas

  • He descubierto que si creo un proyecto nuevo y en las opciones de autenticaciones elijo "sin autenticación" entonces esto funciona, pero si elijo la opción "cuentas de usuario individuales" entonces no funciona.

    alguna idea?


    Juanjo

    sábado, 22 de abril de 2017 18:12