‫۴ سال و ۴ ماه قبل، شنبه ۶ اردیبهشت ۱۳۹۹، ساعت ۱۵:۰۰
با سلام؛ اگه بخواهیم mvc core با این jwt و صفحات razor فعلا اجرا کنیم، مشکل اولین صفحه و Authorization مربوط به اون رو چطور انجام بدیم که کاربر هر درخواست صفحه ای داشت ابتدا به صفحه login هدایت بشه؟
‫۶ سال و ۲ ماه قبل، دوشنبه ۲۵ تیر ۱۳۹۷، ساعت ۱۹:۳۵
در سیستمهای بزرگ enterprise اگر از روش دسترسی پویا استفاده کنیم و همه claim‌ها را در توکن ذخیره کنیم، با هر درخواست کاربر همه claim‌ها با توکن کاربر به سمت سرور ارسال میشوند. این حجم اضافه شده مشکلی ایجاد نمی‌کند؟ یا بهتر است برای سیستمهای بزرگ برای هر بار درخواست کاربر، مجوز دسترسی از دیتابیس چک شود؟
‫۶ سال و ۲ ماه قبل، دوشنبه ۲۵ تیر ۱۳۹۷، ساعت ۱۹:۰۱
با تشکر . یعنی موقعی که توکن ایجاد میشود از claimها هم برای ایجاد آن استفاده میشود؟در اینجا
  private async Task<(string AccessToken, IEnumerable<Claim> Claims)> createAccessTokenAsync(User user)
        {
            var claims = new List<Claim>
            {
                // Unique Id for all Jwt tokes
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString(), ClaimValueTypes.String, _configuration.Value.Issuer),
                // Issuer
                new Claim(JwtRegisteredClaimNames.Iss, _configuration.Value.Issuer, ClaimValueTypes.String, _configuration.Value.Issuer),
                // Issued at
                new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64, _configuration.Value.Issuer),
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString(), ClaimValueTypes.String, _configuration.Value.Issuer),
                new Claim(ClaimTypes.Name, user.Username, ClaimValueTypes.String, _configuration.Value.Issuer),
                new Claim("DisplayName", user.DisplayName, ClaimValueTypes.String, _configuration.Value.Issuer),
                // to invalidate the cookie
                new Claim(ClaimTypes.SerialNumber, user.SerialNumber, ClaimValueTypes.String, _configuration.Value.Issuer),
                // custom data
                new Claim(ClaimTypes.UserData, user.Id.ToString(), ClaimValueTypes.String, _configuration.Value.Issuer)
            };

           // add userclaims for permission
            var clmsuser= await _rolesService.FindUserClaimesAsync(user.Id);
            foreach (var cls in clmsuser)
            {
                claims.Add(new Claim(cls.ClaimType,cls.ClaimValue,ClaimValueTypes.String,_configuration.Value.Issuer));
            }
           
            // add roles
            var roles = await _rolesService.FindUserRolesAsync(user.Id);
            foreach (var role in roles)
            {
                claims.Add(new Claim(ClaimTypes.Role, role.Name, ClaimValueTypes.String, _configuration.Value.Issuer));
            }

            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.Value.Key));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var now = DateTime.UtcNow;
            var token = new JwtSecurityToken(
                issuer: _configuration.Value.Issuer,
                audience: _configuration.Value.Audience,
                claims: claims,
                notBefore: now,
                expires: now.AddMinutes(_configuration.Value.AccessTokenExpirationMinutes),
                signingCredentials: creds);
            return (new JwtSecurityTokenHandler().WriteToken(token), claims);
        }

و هر تغییر در claimها در سمت کاربر برابر میشود با  برگشت توکن دستکاری شده از سمت سرور و مسدود شدن دسترسی؟
‫۶ سال و ۲ ماه قبل، دوشنبه ۲۵ تیر ۱۳۹۷، ساعت ۱۷:۳۲
سلام. وقت بخیر. من سیاست دسترسی پویا رو به jwt اضافه کردم. کلیه Claimها رو  به accesstoken اضافه میکنم و درست هم عملیات دسترسی چک میشود.
{"jti":"26bdfd20-104f-45d4-a4e1-111044808041",
"iss":"http://localhost:5000/",
"iat":1531729854,
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier":"1",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name":"Vahid",
"DisplayName":"وحید",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/serialnumber":"046fb152a7474043952475cfa952cdc9",
"http://schemas.microsoft.com/ws/2008/06/identity/claims/userdata":"1",
"DynamicPermission":[":MyProtectedApi2:Get",
":MyProtectedEditorsApi:Get",
":MyProtectedApi3:Get",
":MyProtectedApi4:Get"],
"http://schemas.microsoft.com/ws/2008/06/identity/claims/role":["Admin",
"Editor",
"User"],
"nbf":1531729855,
"exp":1531729975,
"aud":"Any"}
 فقط این Claimها که در توکن اضافه میشود در سمت سرور از روی توکن ارسالی کاربر چک میشود؟
 public bool CanUserAccess(ClaimsPrincipal user, string area, string controller, string action)
        {
            var currentClaimValue = $"{area}:{controller}:{action}";
            var securedControllerActions = _mvcActionsDiscoveryService.GetAllSecuredControllerActionsWithPolicy(ConstantPolicies.DynamicPermission);
            if (!securedControllerActions.SelectMany(x => x.MvcActions).Any(x => x.ActionId == currentClaimValue))
            {
                throw new KeyNotFoundException($@"The `secured` area={area}/controller={controller}/action={action} with `ConstantPolicies.DynamicPermission` policy not found. Please check you have entered the area/controller/action names correctly and also it's decorated with the correct security policy.");
            }

            if (!user.Identity.IsAuthenticated)
            {
                return false;
            }

            if (user.IsInRole("Admin"))
            {
                // Admin users have access to all of the pages.
                return true;
            }

            // Check for dynamic permissions
            // A user gets its permissions claims from the `ApplicationClaimsPrincipalFactory` class automatically and it includes the role claims too.


            //for check user has claim for access to action
            return user.HasClaim(claim => claim.Type == ConstantPolicies.DynamicPermissionClaimType &&
                                          claim.Value == currentClaimValue);
        }
امکان دستکاری توسط کاربر وجود ندارد؟ اگر اینطور است چطور این دسترسی‌ها رو در سمت سرور بعد از login در حافظه سرور ذخیره کنیم برای دفعات بعد؟
‫۹ سال و ۱ ماه قبل، دوشنبه ۲ شهریور ۱۳۹۴، ساعت ۱۵:۳۰
با سلام ؛ من یک مشکل در هنگام ثبت فایل در دیتابس دارم که موقع ثبت چند فایل پشت سر هم در هنگام ثبت کوئری ایی که اطلاعات از دیتابیس هنگام ثبت میگیرند درست عمل نمیکنند و فقط بار اول اعمال می‌شوند
public ActionResult EditSave(IEnumerable<HttpPostedFileBase> files, int referid)
       {
           // OASEntities db = new OASEntities();
           // The Name of the Upload component is "files"
           if (files != null)
           {
 
 
               int i =(int)db.letterdatas.Where(x => x.referletid == referid).Max(p => p.seq);
               foreach (var file in files)
               {
                   bool failtestsize = false;
                   if (file.ContentLength > 5096000) failtestsize = true;
                   if (failtestsize) return Content(new Exception("خطا : حجم فایل ارسالی بیش از حد مجاز می‌باشد").Message);
                 //  System.Threading.Thread.Sleep(2000);
                   var xi = db.letterdatas.Where(x => x.referletid == referid).Count();
                   if (xi > 4) return Content(new Exception("خطا : تعداد فایلهای ارسالی بیش از حد مجاز می‌باشد").Message);
 
 
                   i++;
                    
                  
                   var fileName = Path.GetFileName(file.FileName);
 
 
                 
                   byte[] filedata = new byte[file.ContentLength];
                   Stream st = file.InputStream;
                   st.Read(filedata, 0, file.ContentLength);
                   var letterdata = new letterdata
                   {
                       data = filedata,
                       extention = Path.GetExtension(file.FileName),
                       filename = fileName,
                       seq = i,
                       referletid = referid,
                       templetguid = null,
                       fileid = Guid.NewGuid(),
                       userid = db.users.Where(x => x.username == User.Identity.Name).Select(x => x.userid).FirstOrDefault()
 
 
                   };
                   db.letterdatas.Add(letterdata);
                   db.SaveChanges();
                  
               }
               
           }
            
           return Content("");
       }
تو اکشن بالا فایل از kendo upload دریافت و ثبت می‌شه و لی موقعی که چند فایل ارسال میشه دو کوئری زیر درست عمل نمی‌کنند 
int i =(int)db.letterdatas.Where(x => x.referletid == referid).Max(p => p.seq);
var xi = db.letterdatas.Where(x => x.referletid == referid).Count();
یعنی سرعت ثبت بالاتر از حدی که کوئری‌ها اطلاعات رو از db برای هر ثبت فایل بگیرند ضمنا kendo upload به صورت زیر تنظیم شده بدون ارسال همزمان batch غیرفعال است
@(Html.Kendo().Upload()
           .Name("files")
           .ShowFileList(true)
           .Events(x => x.Select("onxselect").Upload("onxupload").Error("o  nxerror"))
         //  .Multiple(false)
         .HtmlAttributes(
       new
       {
           accept =
               ".pdf"
       })
           .Messages(x => x.Select("انتخاب فایل‌های نامه"))
           .Messages(x => x.Remove("حذف فایل"))
            .Messages(x => x.Cancel("لغو فایل"))
           .Messages(x => x.Retry("دوباره"))
             .Messages(x => x.UploadSelectedFiles("در حال ارسال فایلها ..."))
             .Messages(x => x.HeaderStatusUploaded("کلیه فایلها ارسال شد"))
            .Messages(x => x.DropFilesHere("فایل‌ها را به اینجا بکشید"))
           .Async(a => a
               .Save("EditSave", "Lettersdata", new { referid = @ViewBag.referid })
              .Remove("EditRemove", "Lettersdata", new { referid = @ViewBag.referid })
               .AutoUpload(true)
                
              // .Batch(true)
           )
                   .Files(files =>
                   {
                       foreach (var f in @ViewBag.files)
                       {
                           files.Add().Name(f.filename);
 
 
                       }
                   }
                       )
                       )