‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۲۰:۲۳
- آیا فیلتر Authorize را با تگ authorization و location در وب کانفیگ با هم بکار برده‌اید؟ فقط از
فیلتر Authorize در ASP.NET MVC استفاده کنید کافی است.
- بررسی کنید مقدار User.Identity.Name پس از لاگین چیست؟
(در یک صفحه معمولی)
- یک breakpoint داخل public override bool IsUserInRole قرار دهید و ببینید اصلا صدا زده می‌شود؟ چه پارامترهایی را دریافت می‌کند؟
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۱۶:۵۴
- در EF 6 نیاز است یک سری تعاریف را به فایل کانفیگ اضافه کنید : ارتقاء به EF 6 و استفاده از EF 6
- در EF 6 اصلا نیازی به پروفایلر خاصی ندارید : نحوه‌ی لاگ کردن توکار با EF 6
- برنامه‌های دیگری هم برای لاگ کردن وجود دارند (سورس باز و رایگان). مثلا mini profiler
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۱۳:۴۸
User.Identity.Name فقط زمانی مقدار دهی می‌شود که علاوه بر تنظیم authentication mode=Forms در وب کانفیگ، در حین لاگین دو مورد ذیل نیز وجود داشته باشند:
FormsAuthentication.SetAuthCookie(...
// ...
FormsAuthentication.RedirectFromLoginPage(...
ضمنا این رشته در MVC اگر کاربر لاگین نکرده باشد، صرفا string.Empty خواهد بود و نه null (با یک برنامه ساده و جدید آن‌را امتحان کنید). بنابراین مشکل از قسمت دیگری از کدهای شما ناشی می‌شود. stack trace را نیاز است دقیقا بررسی کنید.
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۱۳:۳۵
یک متد الحاقی است به این شکل:
        public static int ToInt(this string data)
        {
            if (string.IsNullOrWhiteSpace(data)) return 0;
            int result;
            return int.TryParse(data, out result) ? result : 0;
        }
فقط هنگام لاگین، به userName خود id کاربر انتساب داده شده:
FormsAuthentication.SetAuthCookie(user.Id.ToString(CultureInfo.InvariantCulture), ...
// ...
FormsAuthentication.RedirectFromLoginPage(user.Id.ToString(CultureInfo.InvariantCulture), ...
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۱۲:۵۲
- به نظر پس از افزودن روش Fody / Costura یاد شده، هنوز تنظیمات قبلی Target Name=AfterResolveReferences که در مطلب جاری توضیح داده شد، در فایل csproj شما موجود است که باید حذف شود. دیگر نیازی به آن نیست (علت درج فایل‌های اضافی؛ چون فایل‌های Fody / Costura فقط با یک پیشوند Costura در فایل نهایی قرار می‌گیرند). همچنین تعریف قبلی AppDomain.CurrentDomain.AssemblyResolve را هم حذف کنید.
+ به احتمال زیاد اسمبلی‌های Stimulsoft فقط همین چند مورد نیستند.
همچنین این مورد را می‌توانید در bug tracker آن‌ها نیز ارسال کنید.
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۱۲:۳۹
- نیازی نیست تمام متدهای RoleProvider دات نت پیاده سازی شوند. برای یک برنامه پیاده سازی دو متد IsUserInRole، GetRolesForUser کافی است. 
- سپس دو کلاس Role و User را باید تعریف کنید. این دو رابطه many-to-many با هم دارند؛ یعنی هر کدام با یک ICollection به دیگری ارتباط پیدا می‌کنند. سپس این دو کلاس را در کلاس Context برنامه مطابق معمول توسط DbSetها در معرض دید EF قرار می‌دهید. مابقی آن کارکردن معمولی با این دو جدول اضافه شده به برنامه است:
    public class EfRolesService : IRolesService
    {
        readonly IUnitOfWork _uow;
        readonly IDbSet<Role> _roles;
        public EfRolesService(IUnitOfWork uow)
        {
            _uow = uow;
            _roles = _uow.Set<Role>();
        }

        public IList<Role> FindUserRoles(int userId)
        {
            var query = from role in _roles
                        from user in role.Users
                        where user.Id == userId
                        select role;

            return query.OrderBy(x => x.Name).ToList();
        }

        public string[] GetRolesForUser(int userId)
        {
            var roles = FindUserRoles(userId);
            if (roles == null || !roles.Any())
            {
                return new string[] { };
            }

            return roles.Select(x => x.Name).ToArray();
        }

        public bool IsUserInRole(int userId, string roleName)
        {
            var query = from role in _roles
                        where role.Name == roleName
                        from user in role.Users
                        where user.Id == userId
                        select role;
            var userRole = query.FirstOrDefault();
            return userRole != null;
        }
    }
و در این حالت CustomRoleProvider به صورت زیر خواهد بود. در این روش فرض شده حین لاگین، user.Id در FormsAuthentication.SetAuthCookie تنظیم می‌شود؛ یعنی userName در این RoleProvider به id آن تنظیم شده:
    public class CustomRoleProvider : RoleProvider
    {
        public override bool IsUserInRole(string username, string roleName)
        {
            // Since the role provider, in this case the CustomRoleProvider is instantiated by 
            // the ASP.NET framework the best solution is to use the service locator pattern. 
            // The service locator pattern is normally considered to be an anti-pattern but 
            // sometimes you have to be pragmatic and accept the limitation on the framework 
            // that is being used (in this case the ASP.NET framework).

            var rolesService = ObjectFactory.GetInstance<IRolesService>();
            return rolesService.IsUserInRole(username.ToInt(), roleName);
        }

        public override string[] GetRolesForUser(string username)
        {
            var rolesService = ObjectFactory.GetInstance<IRolesService>();
            return rolesService.GetRolesForUser(username.ToInt());
        }
// مابقی نیازی نیست پیاده سازی شوند
‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۳ بهمن ۱۳۹۲، ساعت ۰۱:۴۱
یک نکته‌ی تکمیلی
اگر به دنبال یک راه حل پخته‌تر هستید که با انواع و اقسام اسمبلی‌ها بتواند کار کند (از mixed mode گرفته تا pcl و غیره)، افزونه‌ی  Fody / Costura توصیه می‌شود. کار با آن نیز بسیار ساده‌است. فقط کافی است دستور زیر را در کنسول پاور شل نیوگت VS.NET اجرا کنید:
PM> Install-Package Costura.Fody
بعد از نصب، تنها یکبار برنامه را مجددا build کنید.
اکنون اگر اسمبلی آن‌را بررسی کنید موارد ذیل را مشاهده خواهید کرد:

الف) اسمبلی‌های مدفون شده را zip کرده‌است.
ب) فایل pdb هم لحاظ شده.
ج) راه انداز خودکار و کدهای AssemblyResolver را تحت فضای نام  Costura به فایل EXE نهایی افزوده‌است.
 
Fody یکی از ابزارهای AOP سورس باز دات نت است.
‫۱۰ سال و ۸ ماه قبل، چهارشنبه ۲ بهمن ۱۳۹۲، ساعت ۱۲:۳۵
PFX منحصر به ویندوز نیست. اگر برنامه‌ها قادر به پردازش رمزنگاری‌های از نوع کلیدهای عمومی باشند، قادر به خواندن آن نیز خواهند بود. عموما برنامه‌های ساده تا این حد انواع و اقسام استانداردها را رعایت نمی‌کنند. ولی در کل امکان «حذف محدودیت‌های فایل‌های PDF توسط iTextSharp» وجود دارد تا فایل رمزنگاری شده‌ی توسط کلیدهای عمومی را بتوان تبدیل به فایل‌های غیر رمزنگاری شده کرد. پس از رفع محدودیت، برنامه‌های ضعیف PDF خوان هم قادر به گشودن آن‌ها خواهند بود.
‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۱ بهمن ۱۳۹۲، ساعت ۲۰:۰۶
- بعضی از اسمبلی‌های دات نتی Mixed mode هستند؛ مانند System.Data.SQLite.DLL. کد هسته اصلی آن، SQLite نوشته شده با زبان سی است. برای استفاده از آن در دات نت با استفاده از C++ CLI، یک روکش دات نتی تهیه کرده‌اند تا در دات نت به راحتی قابل استفاده شود (روش مرسوم و سریعی است برای استفاده از کتابخانه‌های C و ++C در دات نت). این نوع DLLها با استفاده از روش Assembly.Load ذکر شده در متن قابل بارگذاری نیستند. باید در یک پوشه temp نوشته شده و سپس توسط Assembly.LoadFile بارگذاری شوند. یک مثال کامل در این مورد (قسمت Loading Unmanaged DLL آن مد نظر است): Load DLL From Embedded Resource 
- یک try/catch در قسمت بارگذاری اسمبلی قرار دهید تا بهتر منبع مشکل را شناسایی کنید. یک مثال
- شخص دیگری در اینجا گزارش داده اگر Generate serialization assembly در قسمت تنظیمات پروژه، ذیل Build > Output فعال است، باید خاموش شود تا پروژه کرش نکند.
- اگر نوع اسمبلی، PCL است (Portable Class Library)، باز هم روش Assembly.Load به نحوی که در مطلب ذکر شده کار نمی‌کند و باید به صورت ذیل اصلاح شود:
private static Assembly loadEmbeddedAssembly(string name)
{
    if (name.EndsWith("Retargetable=Yes")) {
        return Assembly.Load(new AssemblyName(name));
    }
    // Rest of your code
    //...
}
- همچنین در کامنت‌های این مطلب شخصی عنوان کرده کرش را با افزودن ویژگی ذیل به متد Main، حل کرده:
[MethodImpl(MethodImplOptions.NoOptimization)]