public void AddPimsKeycloakService_Success()
        {
            // Arrange
            var services = new ServiceCollection();

            var mockPimsService = new Mock <IPimsRepository>();

            services.AddScoped((s) => mockPimsService.Object);
            var mockMapper = new Mock <IMapper>();

            services.AddScoped((s) => mockMapper.Object);
            var mockLogger = new Mock <ILogger <IPimsKeycloakService> >();

            services.AddScoped((s) => mockLogger.Object);
            var user = PrincipalHelper.CreateForPermission();

            services.AddScoped((s) => user);

            var mockConfig = new Mock <IOptions <KeycloakOptions> >();
            var options    = new KeycloakOptions()
            {
                Authority = "test",
                Audience  = "test",
                Client    = "test",
                Admin     = new KeycloakAdminOptions
                {
                    Authority = "test",
                    Users     = "test"
                },
                OpenIdConnect = new OpenIdConnectOptions
                {
                    Token    = "test",
                    UserInfo = "test"
                },
                ServiceAccount = new KeycloakServiceAccountOptions
                {
                    Client = "test",
                    Secret = "test"
                }
            };

            mockConfig.Setup(m => m.Value).Returns(options);
            services.AddScoped((s) => mockConfig.Object);
            var mockOpenIdConnectRequestClient = new Mock <IOpenIdConnectRequestClient>();
            var clientOptions = new AuthClientOptions();

            mockOpenIdConnectRequestClient.Setup(m => m.AuthClientOptions).Returns(clientOptions);
            services.AddScoped((s) => mockOpenIdConnectRequestClient.Object);

            // Act
            var result   = services.AddPimsKeycloakService();
            var provider = result.BuildServiceProvider();
            var service  = provider.GetService <IPimsKeycloakService>();

            // Assert
            result.Should().NotBeNull();
            result.Count.Should().Be(8);
            provider.Should().NotBeNull();
            service.Should().NotBeNull();
        }
Beispiel #2
0
 public HttpGetTokenAutoHandler(IKeycloakClient keycloakClient, 
                                IHttpContextAccessor httpContextAccesor, 
                                KeycloakOptions options)
 {
     _keycloakClient = keycloakClient;
     _httpContextAccesor = httpContextAccesor;
     _options = options;
 }
Beispiel #3
0
        public void CuandoUrlTieneSinPlecaAlFinal()
        {
            var uri     = "http://artemis:8085/auth";
            var options = new KeycloakOptions {
                KeycloakUrl = uri, Realm = "prueba"
            };

            var result = options.KeycloakUrlRealm;

            Assert.AreEqual("http://artemis:8085/auth/realms/prueba", result);
        }
Beispiel #4
0
 /// <summary>
 /// Creates a new instance of an KeycloakRequestClient class, initializes it with the specified arguments.
 /// </summary>
 /// <param name="clientFactory"></param>
 /// <param name="tokenHandler"></param>
 /// <param name="keycloakOptions"></param>
 /// <param name="openIdConnectOptions"></param>
 /// <param name="requestOptions"></param>
 /// <param name="serializerOptions"></param>
 /// <param name="logger"></param>
 public KeycloakRequestClient(
     IHttpClientFactory clientFactory,
     JwtSecurityTokenHandler tokenHandler,
     IOptionsMonitor <KeycloakOptions> keycloakOptions,
     IOptionsMonitor <OpenIdConnectOptions> openIdConnectOptions,
     IOptionsMonitor <RequestOptions> requestOptions,
     IOptionsMonitor <JsonSerializerOptions> serializerOptions,
     ILogger <RequestClient> logger)
     : base(clientFactory, tokenHandler, keycloakOptions, openIdConnectOptions, requestOptions, serializerOptions, logger)
 {
     _keycloakOptions = keycloakOptions.CurrentValue;
 }
        public void AddKeycloakService_Success()
        {
            // Arrange
            var services   = new ServiceCollection();
            var mockConfig = new Mock <IOptions <KeycloakOptions> >();
            var options    = new KeycloakOptions()
            {
                Authority = "test",
                Audience  = "test",
                Client    = "test",
                Admin     = new KeycloakAdminOptions
                {
                    Authority = "test",
                    Users     = "test"
                },
                OpenIdConnect = new OpenIdConnectOptions
                {
                    Token    = "test",
                    UserInfo = "test"
                },
                ServiceAccount = new KeycloakServiceAccountOptions
                {
                    Client = "test",
                    Secret = "test"
                }
            };

            mockConfig.Setup(m => m.Value).Returns(options);
            services.AddScoped((s) => mockConfig.Object);
            var mockOpenIdConnectRequestClient = new Mock <IOpenIdConnectRequestClient>();
            var clientOptions = new AuthClientOptions();

            mockOpenIdConnectRequestClient.Setup(m => m.AuthClientOptions).Returns(clientOptions);
            services.AddScoped((s) => mockOpenIdConnectRequestClient.Object);

            // Act
            var result   = services.AddKeycloakService();
            var provider = result.BuildServiceProvider();
            var service  = provider.GetService <IKeycloakService>();

            // Assert
            result.Should().NotBeNull();
            result.Count.Should().Be(3);
            provider.Should().NotBeNull();
            service.Should().NotBeNull();
        }
Beispiel #6
0
        /// <summary>
        /// Agrega y configura la funcionalidad de Autenticación y autorización de Keycloak a un proyecto .NET Core
        /// </summary>
        /// <param name="services"></param>
        /// <param name="options">Parametro con los valores necesarios para configurar la autenticación de Keycloak.</param>
        /// <returns>Devuelve una referencia a la instancia después de implementar la autenticación con JWT.</returns>
        public static IServiceCollection AddKeycloakAuthentication(this IServiceCollection services, KeycloakOptions options)
        {
            //Se agrega al contenedor de dependencias el KeycloakClient
            services.AddSingleton(options);
            //Se agrega al contenedor las opciones de configuración
            services.AddHttpClient <IKeycloakClient>(c => c.BaseAddress = new Uri(options.KeycloakUrlRealm))
            .AddTypedClient <IKeycloakClient, KeycloakClient>();

            #region PASOS 1 Y 2 (ENVIO Y REFRESCO DE TOKEN)

            if (options.EnableGetTokenAuto || options.EnableRefreshToken)
            {
                services.AddHttpContextAccessor();
                services.AddSession(config => config.Cookie.Name = options.ClientId);

                if (options.EnableGetTokenAuto)
                {
                    _enableGetTokenAuto = true;
                    services.AddTransient <HttpGetTokenAutoHandler>();
                }

                if (options.EnableRefreshToken)
                {
                    _enableRefreshToken = true;
                }
            }

            #endregion

            #region PASOS 3 Y 4 (VALIDACION DE TOKEN)

            var validationParameters = new TokenValidationParameters
            {
                ClockSkew        = options.TokenClockSkew,
                ValidateAudience = false,
                ValidateIssuer   = false
            };

            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(opts =>
            {
                opts.Authority = options.KeycloakUrlRealm;
                opts.Audience  = options.ClientId;
                opts.TokenValidationParameters = validationParameters;
                opts.RequireHttpsMetadata      = false;
                opts.SaveToken = true;
            });

            services.AddTransient <IAuthorizationHandler, HasRoleHandler>(t => new HasRoleHandler(options.ClientId));

            #endregion

            return(services);
        }