مطالب
IdentityServer قسمت دوم
پس از تلاش‌های اولیه برای راه اندازی که نیاز به گوگل کردن موارد مختلف دارد از جمله راه اندازی ssl و certification در لوکال هاست و تنظیم IIS برای استفاده از آن، می‌توان به راه اندازی اولیه آی‌دن‌تی‌تی سرور رسید .
پیش فرض این آموزش این نسخه از آی دنتیتی سرور است :
https://github.com/IdentityServer/IdentityServer2

نگاهی اجمالی به سورس:
Sampel----
AdfsIntegrationFullSample --------
AdfsIntegrationSampleClient -------- 
InMemoryHost -------- 
(MVC and WCF RP (SAML --------
(MVC and Web API (JWT -------- 
MembershipRebootUserRepository --------
OIDC --------
SelfHostConsoleHost --------
ServiceBus Integration -------- 
 src----
Libraries --------
WebSite --------
 Tests --------
از نام مثال‌ها کاملآ مشخص است که هر کدام چه بخشی را پوشش می‌دهند. 
مثلآ پوشه‌ی MembershipRebootUserRepository، مربوط به مدیریت کاربران است و توابع غنی بسیار خوبی در آن استفاده شده‌است. خود MembershipReboot  یک پروژه‌ی دیگر است برای مدیریت کاربران که توسط BrockAllen توسعه داده شده و مدیریت کاربران را بسیار آسان کرده‌است؛ برای مثال به راحتی می‌توان
BrockAllen.MembershipReboot 
BrockAllen.MembershipReboot.Ef   
BrockAllen.MembershipReboot  .Repository
از این آدرس  را به سورس اصلی آی دنتیتی سرور اضافه کرد و از توابع مدیریت کاربران این پروژه استفاده کرد. چون کار را بسیار آسان کرده است. 
برای مثال من برای ایجاد کاربر نیاز داشتم که علاوه بر درج کاربر در سرور آی دنتیتی، در بانک اطلاعاتی خودم هم کاربر درج شود. برای همین برای آی دنتیتی سرور صفحه‌ی ثبت نام نوشتم. برای اینکار فقط با یک شیء از membership به راحتی این تابع پیاده سازی شد: 
          Membership.CreateUser(userName, password, email);  
          Roles.AddUserToRoles(userName, "IdentityServerUsers");
نمونه استفاده   
این افزودن کاربر را می‌توان از هسته‌ی اصلی خود آی دنتیتی سرور استفاده کرد. ولی استفاده از آن به علت راحت بودن و توابع خیلی زیاد BrockAllen.MembershipReboot است و استفاده از آن بسیار کاربردی می‌تواند باشد.  
برای استفاده از خود آی دنتیتی سرور برای ساخت یوزر، وارد قسمت سورس شوید و به کنترلر احراز هویت، یک تابع به نام رجیستر اضافه کنید؛ به این فایل: 
https://github.com/IdentityServer/IdentityServer2/blob/master/src/OnPremise/WebSite/Controller/AccountController.cs 
شکل تابع : 
  [HttpPost]
public ActionResult Register(RegisterModel model)
 {
         UserRepository.CreateUser(model.userName,model.password,model.email);
         Roles.AddUserToRoles(userName, "IdentityServerUsers");
         return  View(model);
}

خود کلاس UserRepository یک کلاس پیاده سازی شده از اینترفیس IUserManagementRepository است که می‌توان خود آن‌را نیز با تزریق وابستگی‌ها تغییر داد و از Membership و بازنویسی توابع قدرتمند MembershipReboot  آن استفاده کرد. لیست توابع این اینترفیس که می‌توانید استفاده کنید: 
        void CreateUser(string userName, string password, string email = null);
        void DeleteUser(string userName);
        
        IEnumerable<string> GetUsers(int start, int count, out int totalCount);
        IEnumerable<string> GetUsers(string filter, int start, int count, out int totalCount);

        void SetPassword(string userName, string password);

        void SetRolesForUser(string userName, IEnumerable<string> roles);
        IEnumerable<string> GetRolesForUser(string userName);

        IEnumerable<string> GetRoles();
        void CreateRole(string roleName);
        void DeleteRole(string roleName);
آدرس اینترفیس 
مطالب
دریافت خروجی سایت
یکی از مشکلاتی که من هر روز در لاگ‌های سایت مشاهده می‌کنم، علاقه وافر بسیاری برای دریافت محتوای کل سایت با استفاده از برنامه‌های مخصوص آن است. البته این افراد هیچ وقت به طور کامل موفق نخواهند شد چون سایت پس از مدتی IP آن‌ها را خواهد بست. اما ... این بازی از روز اول تمامی نداشته ....



بنابراین ضمن اعلام آتش بس (!) اعلام می‌دارد کل محتوای سایت به صورت یک فایل PDF در قسمت ویژه کاربران سایت، قابل دریافت است و یا «دریافت خروجی کامل NET Tips. با فرمت EPub»
این محتوا به صورت خودکار هر روز صبح ساعت 5، بر اساس آخرین تغییرات سایت، به روز خواهد شد.
 

یک نکته: فایل‌های CHM دریافتی از طریق مرورگرها، به صورت پیش‌فرض قابل نمایش نیستند. باید بر روی آن‌ها کلیک راست کنید و سپس در برگه‌ی خواص فایل، بر روی دکمه‌ی unblock آن فایل کلیک کنید تا قابل استفاده شود. 

مطالب
بروز خطای TFS 54000 در Team Foundation Server
این خطا در بیشتر موارد ، به دلیل تداخل بین زمان‌های کامپیوتر کلاینت‌ها و سرور ایجاد می‌شود . مثلا تغییر TimeZone کاربران و سرور یا تغییر دستی تاریخ سرور TFS و مانند آن. در این پست راه حلی برای آن ارائه می‌گردد
اگر اختلاف زمانی کم باشد ، می‌توان تا رسیدن به آن تاریخ صبر کرد و سپس ادامه کار را از سر گرفت ولی راه حل دیگری نیز وجود دارد .
پایگاه داده TFS دارای یک Table به نام tbl_Changeset است . با دستوراتی می‌توان آنها را به روز کرد . برای مثال : 
UPDATE tbl_Changeset
SET CreationDate = CreationDate - number of days set ahead
WHERE CreationDate >= time when the clock got set ahead
توجه داشته باشید که قالب تاریخ در پایگاه داده UTC می‌باشد و باید به این نکته دقت کرد . همچنین در هنگام بروز رسانی مراقب باشید که فقط شما در حال استفاده از سرور باشید
 
مطالب
شرح حال ابزارهای گزارشگیری موجود

مدتی هست که در حال تهیه یک کتابخانه گزارشگیری بر پایه iTextSharp هستم. برای تهیه backlog هم چه جایی بهتر از بررسی سؤالات موجود در انجمن‌ها؛ چیزی مثل این:


بله، تاپیکی با 13 صفحه که حتی یک مورد از درخواست‌های آن هم دارای پاسخ نبود؛ اما باز هم کاربران با علاقه هرچه تمام‌تر یا می‌دونید، از روی عجز درخواستشون رو مطرح می‌کردند و کسی نبود که جواب بده. حقیقتش این است که مشکل از افراد نیست یا اینکه «کسی نبود» یا «کسی نخواست» که جواب بده. مشکل این است که اکثر برنامه‌های گزارشگیری یا گزارش سازی موجود در حد یک Demo ware هستند. «نمی‌تونند» با مشکلات واقعی کاری موجود (در طی 13 صفحه که ذکر شد) راحت کنار بیان و راه حل بدرد بخوری رو ارائه بدن.

پاسخ به بازخورد‌های پروژه‌ها
سوال در مورد Authenticate_Request
سلام؛
بله منطقی است. به این علت که role کاربر در کوکی‌های شخص ذخیره می‌شود این کوئری باید به بانک ارسال شود.
برای مثال فرض کنید که کاربری که وارد سایت شده را مدیر بن کرد یا سطح دسترسیش را تغییر داد، اما تا زمانی که کاربر مجددا اقدام به ورود به سایت نکنه نمی‌توانیم آن کاربر را مسدود کنیم. حال در اینجا به بانک اطلاعاتی متصل شده و سطوج دسترسی و وضعیت کاربر را بررسی می‌کنیم تا در صورت لزوم کاربر را logout اجباری کنیم.
این را هم در نظر بگیری ما با یک DBMS قدرتمند طرف هستیم. اگر قرار باشد با چند ده تا کوئری سیستم مختل شود که...
برای بهینه سازی هم می‌توانید از کش مدت دار سمت سرور استفاده کنید.
در ضمن قسمت مربوط به مدیریت کاربران این سیستم  را از صفر بازنویسی کردم که بسیار قوی‌تر از سیستم کنونی است و هر موقع رابط کاربریش تحت AngularJs آماده شد آن را به اشتراک می‌گذارم.
پاسخ به بازخورد‌های پروژه‌ها
درخواست همزمان گزارش
نباید به تمام کاربران یک فایل را نمایش دهید. چون ممکن است رکوردهایی که گزارش می‌گیرند متفاوت باشد.
یک راه این است که حین ذخیره سازی فایل، یک نام منحصربفرد را تولید کنید. مثلا از Guid استفاده کنید:
AppPath.ApplicationPath + "\\Pdf\\name" + System.Guid.NewGuid().ToString("N") + ".pdf"
روش دیگر این است که اگر برنامه وب است، اصلا از فایل استفاده نکنید و از memory stream استفاده کنید:
using(var memoryStream = new MemoryStream())
{
  return new PdfReport()
   ...
  .Generate(data => data.AsPdfStream(memoryStream));
  // now use memoryStream.ToArray()
}
memoryStream.ToArray حاوی فایل pdf شما است. الان می‌تونید داخل browser اون رو flush کنید.
بازخوردهای پروژه‌ها
نگهداری تاریخجه تغییرات در سیستم
در بعضی از سیستم‌های مثل سیستمهای مالی نیاز بر این است تا تاریخچه تغییرات اطلاعات  در سیستم نگهداری شود به عنوان مثال در سیستم پرسنلی زمانی که شخص تغییر نام یا نام خانوادگی می‌دهد گزارش گیری از اطلاعات شخصی آن فرد تا تاریخ اعمال تغییرات ، باید با نام قبلی باشد و از این تاریخ به بعد با نام جدید .

روش‌های مختلفی برای انجام این عملیات وجود دارد بعضی‌ها یک جدول جداگانه با عنوان نگهدارنده تاریخ در نظر می‌گیرند و بعضی‌ها نیز این اطلاعات را در همان جدول اصلی ذخیره کرده و فیلدهای به جدول اضافه می‌کنند که مشخص می‌کند این اطلاعات در چه زمانهایی صحیح است.
اگر امکان دارد مقاله ای در این خصوص تهیه شود تا کاربران نظرات و پیشنهادات و یا تجربیات خود را در این ضمینه ارائه نماییند.
با تشکر