Example #1
0
        public ClientTokenDto CreateTokenByClient(Client client)
        {
            var accessTokenExpiration = DateTime.Now.AddMinutes(_tokenOption.AccessTokenExpiration);
            var securitykey           = SingService.GetSymmetricSecuriyKey(_tokenOption.SecurityKey);

            SigningCredentials singningCredentials = new SigningCredentials(securitykey, SecurityAlgorithms.HmacSha256Signature);
            JwtSecurityToken   jwtSecurityToken    = new JwtSecurityToken(
                issuer: _tokenOption.Issuer,
                expires: accessTokenExpiration,
                notBefore: DateTime.Now,
                claims: GetClaimByClient(client),
                signingCredentials: singningCredentials
                );

            var handler = new JwtSecurityTokenHandler();
            var token   = handler.WriteToken(jwtSecurityToken);

            var tokenDto = new ClientTokenDto
            {
                AccessToken           = token,
                AccessTokenExpiration = accessTokenExpiration,
            };

            return(tokenDto);
        }
Example #2
0
        public static void AddCustomTokenAuth(this IServiceCollection services, CustomTokenOption tokenOptions)
        {
            services.AddAuthentication(option =>
            {
                option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                //Elimizdeki iki şemayı burda birbiri ile konuşturuyoruz.
                option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opts =>
            {
                //servise.Add diyerek eklemiş bir nesneden instance almka için kullanılır.
                opts.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    //NetCoreApp' taki appsettings.json dosyasındaki alanlar ilgili alanlara setlenir
                    ValidIssuer = tokenOptions.Issuer,

                    //Token'daki Audince dizi olduğu için sıfırıncı indis'ten instance aldık
                    ValidAudience    = tokenOptions.Audience[0],
                    IssuerSigningKey = SingService.GetSymmetricSecuriyKey(tokenOptions.SecurityKey),

                    //Issuer İmzası Doğrulanır
                    ValidateIssuerSigningKey = true, //imzayı doğrular
                    ValidateAudience         = true, //Audice doğrular
                    ValidateIssuer           = true, //Issuer doğrular
                    ValidateLifetime         = true, //Token Ömrünü kontrol eder

                    //Token ömrüne otomatik olarak verilen sürenin 5dk fazlasını verir. Zero komutu o 5dk lık default süreyi kaldırır.
                    //İsteğe bağlı olarak eklenir.
                    ClockSkew = TimeSpan.Zero
                };
            });
        }
Example #3
0
        public TokenDto CreateToken(UserApp userApp)
        {
            //Bugünün üzerine AccessTokenExpiration' dan gelen değeri dakika olarak ekleyip TokenSüresi belirleniyor
            var accessTokenExpiration = DateTime.Now.AddMinutes(_tokenOption.AccessTokenExpiration);

            var refreshtokenExpiration = DateTime.Now.AddMinutes(_tokenOption.RefreshTokenExpiration);

            //Token'ın imzası için kullanılır. Simetrik olarak yaptığımız için SingServiisteki ethoddan çağrılır
            var securitykey = SingService.GetSymmetricSecuriyKey(_tokenOption.SecurityKey);

            //Tokenı imzalıcak securityKey algoritmasını belitmiş olduk.
            SigningCredentials singningCredentials = new SigningCredentials(securitykey, SecurityAlgorithms.HmacSha256Signature);
            JwtSecurityToken   jwtSecurityToken    = new JwtSecurityToken(
                issuer: _tokenOption.Issuer,
                expires: accessTokenExpiration,
                notBefore: DateTime.Now,
                claims: GetClaims(userApp, _tokenOption.Audience),
                signingCredentials: singningCredentials
                );


            //Jwt Token sınıfından instance alınır.
            var handler = new JwtSecurityTokenHandler();

            //Alınan Bu instance Writetoken methodu ile değişkene atanır
            var token = handler.WriteToken(jwtSecurityToken);

            //TokenDto nesnesine döndürülür
            var tokenDto = new TokenDto
            {
                AccessToken            = token,
                RefreshToken           = CreateRefreshToken(),
                AccessTokenExpiration  = accessTokenExpiration,
                RefreshTokenExpiration = refreshtokenExpiration
            };

            return(tokenDto);
        }
Example #4
0
        public void ConfigureServices(IServiceCollection services)
        {
            //Herhangi bir consturacture' da Ýlgili Interface i görürse, ilgili classýný kullanýcaðýný anlar.
            services.AddScoped <IAuthenticationService, AuthenticationService>();
            services.AddScoped <IUserService, UserService>();
            services.AddScoped <ITokenService, TokenService>();

            //Generic olduklarý için typeof kullanarak eklenmelidir
            services.AddScoped(typeof(IGenericRepository <>), typeof(GenericRepository <>));

            //IGenericService 2 tane generic parametre aldýðý için <> arasýna virgül koyuyoruz.
            //Aldýðý parametre sayýsýnýn bir eksiði kadar virgül koymamýz gerekir
            services.AddScoped(typeof(IGenericService <,>), typeof(GenericService <,>));
            services.AddScoped <IUnitOfWork, UnitOfWork>();

            //DBContext alanlarýný eklemek
            services.AddDbContext <AppDbContext>(options =>
            {
                //DB ye baðlanmasý için ilgili Methoda appsettings.json 'da yazdýðýmýz SQlServer düðümünü veriyoruz
                options.UseSqlServer(Configuration.GetConnectionString("SqlServer"), sqloptions =>
                {
                    //Migration yapýlacak olan kýsmý seçiyoruz. data katmanýnda olduðu için Data katmanýný seçtik.
                    sqloptions.MigrationsAssembly("AuthServer.Data");
                });
            });



            //Identity DB'si için eklenmesi gereken alanlar
            services.AddIdentity <UserApp, IdentityRole>(opt => {
                //Email Uniq olmasý için true setlenir
                opt.User.RequireUniqueEmail = true;

                //alfanumerik olmayan(*,?,-) karakter zorunlu olmasýn diye false setlendi
                opt.Password.RequireNonAlphanumeric = false;
            }).AddEntityFrameworkStores <AppDbContext>().AddDefaultTokenProviders();

            //CustomtokenOption classýna mapplemek için kullanýlýr
            services.Configure <CustomTokenOption>(Configuration.GetSection("TokenOption"));


            services.Configure <List <Client> >(Configuration.GetSection("Clients"));

            //Authentication kýsmý için kullanýlýr. Birden fazla Authentication gerektiren sistemlerde mevcuttur.
            //O zaman AuthenticationSheme yerine istediðimiz string adda belirtebiliriz.
            //Örnek olarak hem müþteri login ekraný hemde bayiler için farklý giriþ ekraný ve Authentication iþlemi kullandýðýmýz zamanlarda string ile belirtebilirz.
            services.AddAuthentication(option =>
            {
                option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                //Elimizdeki iki þemayý burda birbiri ile konuþturuyoruz.
                option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opts =>
            {
                //servise.Add diyerek eklemiþ bir nesneden instance almka için kullanýlýr.
                var tokenOptions = Configuration.GetSection("TokenOption").Get <CustomTokenOption>();
                opts.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    //NetCoreApp' taki appsettings.json dosyasýndaki alanlar ilgili alanlara setlenir
                    ValidIssuer = tokenOptions.Issuer,

                    //Token'daki Audince dizi olduðu için sýfýrýncý indis'ten instance aldýk
                    ValidAudience    = tokenOptions.Audience[0],
                    IssuerSigningKey = SingService.GetSymmetricSecuriyKey(tokenOptions.SecurityKey),

                    //Issuer Ýmzasý Doðrulanýr
                    ValidateIssuerSigningKey = true, //imzayý doðrular
                    ValidateAudience         = true, //Audice doðrular
                    ValidateIssuer           = true, //Issuer doðrular
                    ValidateLifetime         = true, //Token Ömrünü kontrol eder

                    //Token ömrüne otomatik olarak verilen sürenin 5dk fazlasýný verir. Zero komutu o 5dk lýk default süreyi kaldýrýr.
                    //Ýsteðe baðlý olarak eklenir.
                    ClockSkew = TimeSpan.Zero
                };
            });


            //services.AddControllers();
            //****** FluentVAlidation Kullandýðýmýz için kullanýmý böyle olmalýdýr
            services.AddControllers().AddFluentValidation(option =>
            {
                option.RegisterValidatorsFromAssemblyContaining <Startup>();//Startup altýnda tüm AbstractValidator den türeyen classlar için çalýþýr
            });

            //FluentValitaion ile birlikte default dönen hatalar yerine, dönmesini istediðimiz errorDtor extension classý
            services.UseCustomValidationResponse();

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo {
                    Title = "NetCoreApp.API", Version = "v1"
                });
            });
        }