public TimeManager(IRepository <ToolkitUser> tkUserRepo, IRepository <List <Toolkit> > tkRepo, IRepository <List <Timeregistration> > timeregRepo, ISharepointClient spClient, IEncryption encryptionManager) { _toolkitUserRepository = tkUserRepo; _toolkitRepository = tkRepo; _timeregistrationRepository = timeregRepo; _sharepointClient = spClient; UserInfo = _toolkitUserRepository.GetData(); if (UserInfo.Password?.Length > 0) { UserInfo.SecurePassword = new NetworkCredential("", encryptionManager.DecryptText(UserInfo.Password)) .SecurePassword; } _toolkits = _toolkitRepository.GetData(); }
public virtual T DecryptEntityFields(T entity, DevnotContext _dbcontext) { MetadataTypeAttribute[] metadataTypes = entity.GetType().GetCustomAttributes(true).OfType <MetadataTypeAttribute>().ToArray(); foreach (MetadataTypeAttribute metadata in metadataTypes) { System.Reflection.PropertyInfo[] properties = metadata.MetadataClassType.GetProperties(); //Metadata atanmış entity'nin tüm propertyleri tek tek alınır. foreach (System.Reflection.PropertyInfo pi in properties) { //Eğer ilgili property ait CryptoData flag'i var ise ilgili deger Decrypt edilir. if (Attribute.IsDefined(pi, typeof(DAL.PartialEntites.CryptoData))) { _dbcontext.Entry(entity).Property(pi.Name).CurrentValue = _encryption.DecryptText(_dbcontext.Entry(entity).Property(pi.Name).CurrentValue.ToString()); } } } return(entity); }
public void Init() { _toolkitUserRepository = new Repository <ToolkitUser>(); _toolkitUser = _toolkitUserRepository.GetData(); try { _toolkitUser.SecurePassword = new NetworkCredential("", _encryptionManager.DecryptText(_toolkitUser.Password)).SecurePassword; } catch (Exception) { _toolkitUser.SecurePassword = new NetworkCredential("", "").SecurePassword; } _toolkitUser.Password = ""; _sharepointClient = new SharepointClient(); _clientContext = new ClientContext("https://goto.netcompany.com/cases/GTO22/NCMOD") { Credentials = new NetworkCredential(_toolkitUser.Name, _toolkitUser.SecurePassword, _toolkitUser.Domain) }; }
public void OnActionExecuting(ActionExecutingContext context) { try { //Kontrol edilmesi gereken bir Action mı ? Mesela Login için bu işlem yapılmaz! if (HasIgnoreAttribute(context)) { return; } //BeHalfOfToken and BeHalfOfUserId //Birinin Adına mı Girmiş! var beHalfOfUserId = context.HttpContext.Request.Headers["BeHalfOfUserId"].FirstOrDefault(); var beHalfOfToken = context.HttpContext.Request.Headers["BeHalfOfToken"].FirstOrDefault(); var beHalfOfPassword = context.HttpContext.Request.Headers["BeHalfOfPassword"].FirstOrDefault(); //beHalfOfUserId parametersi ZORUNLU olmadığı için, null ise "beHalfOfPassword" değerinden alınır. if (beHalfOfPassword != null && (beHalfOfUserId == null || int.Parse(beHalfOfUserId) == 0) && !string.IsNullOrEmpty(beHalfOfPassword)) { var decryptBeHalfOfPassword = _encryption.DecryptFromClientData(beHalfOfPassword); if (decryptBeHalfOfPassword.Split('@').Length > 1) { beHalfOfUserId = decryptBeHalfOfPassword.Split('@')[1]; } } bool.TryParse(context.HttpContext.Request.Headers["IsMobile"].FirstOrDefault(), out var isMobile); int.TryParse(context.HttpContext.Request.Headers["UserId"].FirstOrDefault(), out var userId); //Mobile için var unqDeviceId = context.HttpContext.Request.Headers["UnqDeviceId"].FirstOrDefault(); //Tüm platformlar için gerekli kontrollerin yapılabilmesi için UserID şarttır. //if (userId == 0) // Başkası Adına da Girmiş Olabilir (BeHalfOf) if (userId == 0 && int.Parse(beHalfOfUserId) == 0) { context.Result = new UnauthorizedResult(); return; } //Genel Kullanılacak değişkenler burada atanır. _workContext.CurrentUserId = userId; _workContext.IsMobile = isMobile; //-------------------------------------- //BeHalfOfUserId Global if (beHalfOfUserId != null && beHalfOfUserId != "" && int.Parse(beHalfOfUserId) > 0) { _workContext.CurrentBeHalfOfUserId = int.Parse(beHalfOfUserId); } //Set UserIsAdmin UserModel user = _userService.GetById(userId).Entity; if (user != null) { _workContext.IsAdmin = user.IsAdmin; } //--------------------- //BeHalfOfToken Check! Birisinin Adına Girmiş İse Onun Kuralları Geçerli Olur. if (beHalfOfToken != null && beHalfOfToken != "") { var decryptBeHalfOfToken = _encryption.DecryptText(beHalfOfToken); var decryptBeHalfOfPassword = _encryption.DecryptFromClientData(beHalfOfPassword); var cacheRedisbeHalfOfToken = _redisCacheService.Get <string>(_redisCacheService.GetTokenKeyForBeHalfOf(int.Parse(beHalfOfUserId), decryptBeHalfOfPassword)); //Başkasının yerine girdi ve bilgiler doğru değil ise devam edilmez. Geriya hata dönülür. if (string.IsNullOrEmpty(cacheRedisbeHalfOfToken) || (!string.IsNullOrEmpty(cacheRedisbeHalfOfToken) && cacheRedisbeHalfOfToken.Trim() != decryptBeHalfOfToken.Trim())) { context.Result = new ObjectResult(context.ModelState) { Value = _localizer["BeHalfofTokenException"], StatusCode = 431 }; return; } } else { //BeHalfOf Değil ise Token Kontrolü yapılır. string authHeader = context.HttpContext.Request.Headers["Authorization"]; //Not: Bu durum sadece Web ortamı için geçerlidir. Mobilden her zaman Token gelmektedir. if (authHeader != null && authHeader.StartsWith("Bearer")) { //Extract credentials var token = authHeader.Substring("Bearer ".Length).TrimStart(); var decryptToken = _encryption.DecryptText(token); //Not: Bu durum sadece Web ortamı için geçerlidir. Mobilden her zaman Token gelmektedir. Hiçbir zaman timeout'a uğramaz. Tek fark 45 dakikadan büyük ise RefreshToken'da gönderilir. if (string.IsNullOrEmpty(decryptToken))// token yoksa UnauthorizedResult dönüyoruz. Bu sadece Web ortamı için geçerlidir. Mobilede her zaman Token dönülür. Gelmemiş ise ona da UnauthorizedResult dönülür. { context.Result = new UnauthorizedResult(); return; } //İlgili UserID'ye ait Token Redis'den alınır. var cacheRedistoken = _redisCacheService.Get <string>(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId)); if (string.IsNullOrEmpty(cacheRedistoken) && isMobile) // Redis'de Token Key yok ise , bu durum SADECE MOBILE'DE BAKILMALIDIR. { //Refresh Token kontrolü yapılır. CreateTokensByCheckRefreshToken(context, true); //true'nun amacı context.Result = new UnauthorizedResult() dönüşünün yapılmasının istenmesidir. #region CreateTokensByCheckRefreshToken Methodu Altına Taşındı. //if (context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault() != null) // client refresh token göndermiş. //{ // var clientRefreshToken = context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault(); // var redisRefreshToken = _redisCacheService.Get<string>(_redisCacheService.GetTokenKey(userId, isMobile, true, unqDeviceId)); // if (string.IsNullOrEmpty(redisRefreshToken))//rediste refresh token yok // { // context.Result = new UnauthorizedResult(); // return; // } // var decClientRefreshToken = _encryptionService.DecryptText(clientRefreshToken); // if (decClientRefreshToken == redisRefreshToken)//Refresh Token doğru. Yeni token ve refresh token üretip dönelim. // { // UserModel user = _userService.GetById(userId).Entity; // var (encToken, decToken) = _encryptionService.GenerateToken(user.Email); // //Oluşturulsn Token Redis'e atılır. // var createTime = DateTime.Now; // //Token Oluşturulur. Mobilde ve Web'de 1 saattir. appsettings.json'a bakınız. // DateTime tokenExpireTime = createTime.AddMinutes(_coreContext.TokenExpireTime); // _redisCacheService.Set(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId), decToken, tokenExpireTime); // //Geri dönülecek Encrypt Token ve Yaratılma zamanı Client'ın Header'ına atanır // context.HttpContext.Items["token"] = encToken; // context.HttpContext.Items["createdTokenTime"] = createTime.GetTotalMilliSeconds(); // //RefreshToken Oluşturulur. // //Refresh Token Mobilde 1 Yıl, Web'de 1.5 saattir. appsettings.json'a bakınız. // var refreshToken = GenerateRefreshToken(user, context, unqDeviceId, isMobile); // if (!string.IsNullOrWhiteSpace(refreshToken)) // { // //Oluşturulan RefreshToken Client'a dönülür. // context.HttpContext.Items["refreshToken"] = refreshToken; // } // } // else // { // context.Result = new UnauthorizedResult(); // return; // } //} //else //{ // context.Result = new UnauthorizedResult(); // return; //} #endregion } else if ((string.IsNullOrEmpty(cacheRedistoken)) || (!string.IsNullOrEmpty(cacheRedistoken) && cacheRedistoken.Trim() != decryptToken.Trim())) //Redis'de Token Yok Ya da Redis'de Token Var ama tokenlar eşit değil , geçerli bir oturum isteği değil. { context.Result = new UnauthorizedResult(); return; } //Redis'in süresine bakılacak var tokenSession = decryptToken.Split('ß')[2]; var sessionCreateTime = DateTime.Parse(tokenSession); var remainingTime = DateTime.Now - sessionCreateTime; //Tokenlar eşit , 45 ile 60'ıncı dakikalar arasındaysa token ve refresh token'ı yenileyip dönelim. Önemli Not: Redis Cache'de Token var ise! //if (remainingTime.TotalMinutes >= _coreContext.TokenExpireTime && remainingTime.TotalMinutes <= _coreContext.TokenExpireTime - 15) //if (remainingTime.TotalMinutes >= _coreContext.TokenExpireTime - 15 && remainingTime.TotalMinutes <= _coreContext.TokenExpireTime) //1. KONTROL if ((string.IsNullOrEmpty(cacheRedistoken) == false) && (remainingTime.TotalMinutes >= _coreContext.TokenExpireTime - 15 && remainingTime.TotalMinutes <= _coreContext.TokenExpireTime)) { //------------CheckTime On Redis //İlgili UserID'ye ait Token Redis'den alınır. // cacheRedistoken = _redisCacheService.Get<string>(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId)); // var redisToken = cacheRedistoken.Split('ß')[2]; // var redisTokenCreateTime = DateTime.Parse(redisToken); // var redisTokenTime = DateTime.Now - redisTokenCreateTime; //Bu 3. Kontrol oluyordu. Kaldırıldı. //------------End CheckTime on Redis //Check TimeOut 2. Time for Backend Redis! // if (redisTokenTime.TotalMinutes >= _coreContext.TokenExpireTime - 15) // { lock (lockObject) { //Double Check Lock With Redis Key! //İlgili UserID'ye ait Token Redis'den alınır. cacheRedistoken = _redisCacheService.Get <string>(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId)); var redisToken = cacheRedistoken.Split('ß')[2]; var redisTokenCreateTime = DateTime.Parse(redisToken); var redisTokenTime = DateTime.Now - redisTokenCreateTime; //2.KONTROL Check Timeout 2. Time for Backend Redis! if (redisTokenTime.TotalMinutes >= _coreContext.TokenExpireTime - 15) { CreateTokensByCheckRefreshToken(context); } } // } #region CreateTokensByCheckRefreshToken Methodu Altına Taşındı. //if (context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault() != null) // client refresh token göndermiş. //{ // var clientRefreshToken = context.HttpContext.Request.Headers["RefreshToken"].FirstOrDefault(); // var redisRefreshToken = _redisCacheService.Get<string>(_redisCacheService.GetTokenKey(userId, isMobile, true, unqDeviceId)); // if (string.IsNullOrEmpty(redisRefreshToken))//rediste refresh token yok // { // context.Result = new UnauthorizedResult(); // return; // } // var decClientRefreshToken = _encryptionService.DecryptText(clientRefreshToken); // if (decClientRefreshToken == redisRefreshToken)//Refresh Token doğru. Yeni token ve refresh token üretip dönelim. // { // UserModel user = _userService.GetById(userId).Entity; // var (encToken, decToken) = _encryptionService.GenerateToken(user.Email); // //Oluşturulan Token Redis'e atılır. // var createTime = DateTime.Now; // DateTime tokenExpireTime = createTime.AddMinutes(_coreContext.TokenExpireTime); // _redisCacheService.Set(_redisCacheService.GetTokenKey(userId, isMobile, false, unqDeviceId), decToken, tokenExpireTime); // //Geri dönülecek Encrypt Token ve Yaratılma zamanı Client'ın Header'ına atanır // context.HttpContext.Items["token"] = encToken; // context.HttpContext.Items["createdTokenTime"] = createTime.GetTotalMilliSeconds(); // //RefreshToken Oluşturulur. // //Refresh Token Mobilde 1 Yıl Web'de 1.5 saattir. appsettings.json'a bakınız. // var refreshToken = GenerateRefreshToken(user, context, unqDeviceId, isMobile); // if (!string.IsNullOrWhiteSpace(refreshToken)) // { // //Oluşturulan RefreshToken Client'a dönülür. // context.HttpContext.Items["refreshToken"] = refreshToken; // } // } //} #endregion } } else { context.Result = new UnauthorizedResult(); return; } } //Role Yetkisine bakılır. //if (HasRoleAttribute(context) && !_workContext.IsAdmin) if (HasRoleAttribute(context) && ((beHalfOfUserId == null && !_workContext.IsAdmin) || (beHalfOfUserId != null))) { try { var arguments = ((ControllerActionDescriptor)context.ActionDescriptor).MethodInfo.CustomAttributes.FirstOrDefault(fd => fd.AttributeType == typeof(RoleAttribute)).ConstructorArguments; int roleGroupID = (int)arguments[0].Value; Int64 roleID = (Int64)arguments[1].Value; //BeHalfOfUserID değeri var ise o verilir. Yok ise client'ın UserID değeri alınır. int userIDprm = _workContext.CurrentBeHalfOfUserId != 0 ? _workContext.CurrentBeHalfOfUserId : userId; RoleModel role = _roleService.GetRoleById(userIDprm, roleGroupID, roleID).Entity; //RoleModel role = _roleService.GetRoleById(userId, roleGroupID, roleID).Entity; if (role.Id == 0) { //Forbidden 403 Result. Yetkiniz Yoktur.. context.Result = new ObjectResult(context.ModelState) { //Value = null, //Value = "You are not authorized for this page", Value = _localizer["Forbidden"], StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status403Forbidden }; return; } } catch { int i = 0; } } else if (HasAdminAttribute(context) && !_workContext.IsAdmin)//User'a Admin yetkisinin verilmesi ya da alınması yetkisine bakılır. { //Forbidden 403 Result. Yetkiniz Yoktur.. context.Result = new ObjectResult(context.ModelState) { //Value = null, //Value = "You are not Admin for this Action", Value = _localizer["ForbiddenAdmin"], StatusCode = Microsoft.AspNetCore.Http.StatusCodes.Status403Forbidden }; return; } else { int y = 0; } //Log işlemleri if (HasLogAttribute(context)) { string action = (string)context.RouteData.Values["action"]; string controller = (string)context.RouteData.Values["controller"]; //Loglanacak Model Alınır foreach (ControllerParameterDescriptor param in context.ActionDescriptor.Parameters) { if (param.ParameterInfo.CustomAttributes.Any( attr => attr.AttributeType == typeof(FromBodyAttribute)) ) { var entity = context.ActionArguments[param.Name]; //Burada BeHalhOfUserID'de kullanılabilir. context.HttpContext.Items[userId + "_" + controller + "_" + action] = entity; } } //--------------------------------- } } catch (InvalidTokenException ex) { //Forbidden 430 Result. Yetkiniz Yoktur.. context.Result = new ObjectResult(context.ModelState) { //Value = "Invalid Token Execption." + ex.Message, Value = _localizer["TokenException"] + ex.Message, StatusCode = 430 }; return; } }