none
ASP.NET Core Autenticación Windows RRS feed

  • Pregunta

  • Buenos días,

    A ver si me podéis orientar. Estoy preparando un proyecto ASP.Net CORE con Angular con runtime .Net Framework. Esta alojado en un servidor IIS y quiero realizar una validación de usuarios mediante Windows (no se si es posible mediante Active Directory).  La idea es que con una base de datos existente (nombre usuario (User.Identity.Name) y roles) autorice acceso a métodos del Controller o no.

    De momento he configurado el Program.cs de eta forma:

      public static IWebHost BuildWebHost(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                    .UseKestrel() //Soporte IIS en ASP.Net CORE. Servidor que se utilizará para alojar aplicación.
                    .UseContentRoot(Directory.GetCurrentDirectory()) //Soporte IIS en ASP.Net CORE
                    .UseIISIntegration() //Soporte IIS en ASP.Net CORE. Le dice a ASP.NET que IIS funcionará como un proxy inverso frente a Kestrel.
                    .UseStartup<Startup>()
                    .Build();

    En el Startup.cs ando algo mas perdido, de momento:

            public void ConfigureServices(IServiceCollection services)
            {
                services.Configure<IISOptions>(options =>
                {
                    options.AutomaticAuthentication = false;
                });
    
                services.AddMvc();
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                    #if DEBUG
                    app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
                    {
                        HotModuleReplacement = true
                    });
                    #endif
                }
                else
                {
                    app.UseExceptionHandler("/Home/Error");
                }
    
                app.UseStaticFiles();
    
                app.UseAuthentication();
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
    
                    routes.MapSpaFallbackRoute(
                        name: "spa-fallback",
                        defaults: new { controller = "Home", action = "Index" });
                });
            }

    La idea es que desde angular realice una petición y según el usuario me autorice. Entiendo que he de jugar con [Authorize].

    Es que encuentro mucha ayuda y ejemplos de autorización/identificación con cuentas individuales (Googe, Facebook, etc) pero con autentificacion Windows pocos y quizás no tengo los conceptos claros.

    Saludos

    lunes, 25 de diciembre de 2017 6:14

Respuestas

  • hola

    >>Cuando el usuario llama a mi web, al tener la opción de autenticacion Windows en IIS activada en mi aplicación Net Core ya se está autentificando realmente

    esta autenticando el acceso al html que renderiza, pero no las llamadas de la webapi, porque desde angular usas $http y alli no pasan las credenciales de windows

    no aplica al seguridad integrada de windows en el sitio si usas angular o la verdad es que nunca he visto que se integre angular con la seguridad de windows, no de forma directa

    entiendo esto se debe a la forma en realizar el request al servidor, en este caso a la webapi

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 26 de diciembre de 2017 17:27
  • hola

    >>La idea es que desde angular realice una petición y según el usuario me autorice.

    pero para eso deberias impementar una autenticacion basada en token

     ASP.NET Core 2.0 Bearer Authentication

    la idea es que desde angular pases las credenciales para autenticar y despues en cada llamada debas pasar ese token para que valide

    no hay una autenticacion windows como lo planteas sino que deberas en la implementacion del webapi del token ver como consultar active directory

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 25 de diciembre de 2017 19:18
  • hola

    >>Realmente como es un entorno corporativo los clientes se han de conectar previamente con su login y password.

    para autenticar la aplicacion desde angular a los servicio webapi requieres de un token, esto lo proporciona Jwt

    Generar el token puedes realizarlo contra una db o usar active directory (si es que validas contra un controladore de dominio en windows), pero para la aplicaicon web es indistinto, cuando tengas el token mientras no expire podras pasarlo mediente $http y el servicio webapi dejara ingresar

    >>Cuando hacen la llamada a la Api, únicamente he de capturar el usuario y cruzarlo con mi base de datos sql server local de usuarios a los que quiero facilitar acceso a los distintos métodos del controller

    pero para validar usuario tienes una db, o usas las credenciales de windows ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 26 de diciembre de 2017 14:16
  • hola

    >>El que me devuelve el usuario es la parte servidor(controller/API) y entiendo que este es el que se ha autentificado en IIS ¿no?

    si invocas estando autenticado con diferentes usuarios en windows te retorna ese usuario? o retorna el usuario de Application Pool del IIS?

    deberis validar que el  User.Identity retorne el usuario de windows con el cual te autenticas en windows, pero deberia cambiar si usas un usuario diferente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 26 de diciembre de 2017 20:27

Todas las respuestas

  • hola

    >>La idea es que desde angular realice una petición y según el usuario me autorice.

    pero para eso deberias impementar una autenticacion basada en token

     ASP.NET Core 2.0 Bearer Authentication

    la idea es que desde angular pases las credenciales para autenticar y despues en cada llamada debas pasar ese token para que valide

    no hay una autenticacion windows como lo planteas sino que deberas en la implementacion del webapi del token ver como consultar active directory

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 25 de diciembre de 2017 19:18
  • Gracias Leandro como siemore tus respuestas te guían por el camino a seguir. Por lo que entiendo entonces entre angular y la web api me tendría que comunicar mediante Jwt y luego mi api ha de ser la que valide el usuario. Realmente como es un entorno corporativo los clientes se han de conectar previamente con su login y password. Cuando hacen la llamada a la Api, únicamente he de capturar el usuario y cruzarlo con mi base de datos sql server local de usuarios a los que quiero facilitar acceso a los distintos métodos del controller


    • Editado Tayson1984 lunes, 25 de diciembre de 2017 20:56
    lunes, 25 de diciembre de 2017 20:13
  • hola

    >>Realmente como es un entorno corporativo los clientes se han de conectar previamente con su login y password.

    para autenticar la aplicacion desde angular a los servicio webapi requieres de un token, esto lo proporciona Jwt

    Generar el token puedes realizarlo contra una db o usar active directory (si es que validas contra un controladore de dominio en windows), pero para la aplicaicon web es indistinto, cuando tengas el token mientras no expire podras pasarlo mediente $http y el servicio webapi dejara ingresar

    >>Cuando hacen la llamada a la Api, únicamente he de capturar el usuario y cruzarlo con mi base de datos sql server local de usuarios a los que quiero facilitar acceso a los distintos métodos del controller

    pero para validar usuario tienes una db, o usas las credenciales de windows ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 26 de diciembre de 2017 14:16
  • Hola Leandro precisamente la duda viene un poco por ahí. En mi base de datos yo tengo una tabla con el nombre de usuario, y las vistas (o componentes en Angular) a los que quiero que tengan acceso y puedan visualizar. Cuando el usuario llama a mi web, al tener la opción de autenticacion Windows en IIS activada en mi aplicación Net Core ya se está autentificando realmente, solo he de gestionar la autorización por decirlo de alguna forma. Extraer el user, permitir o no los diferentes métodos en el controller y permitir o no las diferentes vistas en la parte cliente (angular). No se si tengo los conceptos de utilización algo confusos que no lo descarto.
    martes, 26 de diciembre de 2017 16:56
  • hola

    >>Cuando el usuario llama a mi web, al tener la opción de autenticacion Windows en IIS activada en mi aplicación Net Core ya se está autentificando realmente

    esta autenticando el acceso al html que renderiza, pero no las llamadas de la webapi, porque desde angular usas $http y alli no pasan las credenciales de windows

    no aplica al seguridad integrada de windows en el sitio si usas angular o la verdad es que nunca he visto que se integre angular con la seguridad de windows, no de forma directa

    entiendo esto se debe a la forma en realizar el request al servidor, en este caso a la webapi

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 26 de diciembre de 2017 17:27
  • Gracias Leandro creo que me van encajando cosas. Por ejemplo he realizado una prueba desde una plantilla Visual Studio 2017 con angular. En el controller (API) he creado este metodo:

    [HttpGet("[action]")]
    public IActionResult Users()
    {
                dynamic user = new JObject();
                user.usuario = User.Identity.Name;
                user.authType = User.Identity.AuthenticationType;
                return Json(user); 
    }

    Cuando realizo una llamada desde la parte front-end (angular) me devuelve el nombre de usuario windows autentificado AD\USERNAME

        getUsuarioWindows(): void {
            this.http.get(this.urlBase + '/api/SampleData/Users/').subscribe(res => {
                this.nombreWindows = res.json();
                console.log(this.nombreWindows);
            });
        }
    El que me devuelve el usuario es la parte servidor(controller/API) y entiendo que este es el que se ha autentificado en IIS ¿no?


    martes, 26 de diciembre de 2017 18:55
  • hola

    >>El que me devuelve el usuario es la parte servidor(controller/API) y entiendo que este es el que se ha autentificado en IIS ¿no?

    si invocas estando autenticado con diferentes usuarios en windows te retorna ese usuario? o retorna el usuario de Application Pool del IIS?

    deberis validar que el  User.Identity retorne el usuario de windows con el cual te autenticas en windows, pero deberia cambiar si usas un usuario diferente

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 26 de diciembre de 2017 20:27
  • Leandro entiendo que debe ser el usuario Application Pool de IIS. Una vez subida la app al iis del Windows server(servidor) cuando un usuario (intranet) intenta acceder a la url/IP de la web le aparece un mensaje en el navegador solicitando usuario y contraseña. Esta petición usuario y contraseña no es realizada por mi, entiendo que es el propio servidor el que realiza esa solicitud o por cuando activo autenticacion Windows al subir la app net core a los sites de IIS. Los usuarios de ese servidor deben apuntar al active directory corporativo y por ello los autentifica (es una suposición).

    El servidor es administrado y estaba configurado previamente por lo que desconozco todas las configuraciones realizadas, aunque tengo permisos para revisarlas o modificarlas.

    Edito: Al ejecutar mi proyecto en depuración (IIS Express) si extrae el username:

    Usuario: XXXXXXXX\xxxxx

    IsAuthenticated: true

    AuthenticationType: NTLM

    Cuando lo subo al servidor IIS no me devuelve usuario.El codigo comentando anteriormente en ASP.NET clásico no me daba problemas. Parece que Kestrel no admite autentificacion windows y quizás HTTP.sys si, pero entonces no lo puedo utilizar con IIS ¿no?. Me da la sensación que en Net Core todo es muy confuso


    • Editado Tayson1984 miércoles, 27 de diciembre de 2017 15:13
    martes, 26 de diciembre de 2017 21:29