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); }
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 }; }); }
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); }
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" }); }); }