با سلام.
من یک CustonRoleProvider با کدهای زیر ساختم:
using System; using System.Collections.Generic; using System.Configuration.Provider; using System.Linq; using System.Web; using System.Web.Security; using Talash.Models; namespace Talash { public class CustomRoleProvider : RoleProvider { talasheduEntities talash = new talasheduEntities(); public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override void CreateRole(string roleName) { if (RoleExists(roleName)) { throw new ProviderException("Role name already exists."); } else { Tbl_Role r = new Tbl_Role(); r.RoleName = roleName; talash.Tbl_Role.Add(r); talash.SaveChanges(); }//throw new NotImplementedException(); } public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) { Tbl_Role r = talash.Tbl_Role.First(i=>i.RoleName==roleName); talash.Tbl_Role.Remove(r); throw new NotImplementedException(); } public override string[] GetRolesForUser(string username) { string[] f = {""}; var d = (from u in talash.Tbl_User join k in talash.Tbl_RoleInUser on u.UserID equals k.UserID join r in talash.Tbl_Role on k.RoleID equals r.RoleID select new { r.RoleName }); for (int i = 0; i < d.Count(); i++) { f[i] = d.ToArray()[i].RoleName; } return f; } public override bool RoleExists(string roleName) { bool exists = false; var role = from r in talash.Tbl_Role where r.RoleName == roleName select r.RoleID; if (role.Count()>0) { exists = true; } return exists; }
در وب کانفیگ نیز کدهای زیر را گذاشته ام:
<authentication mode="Forms"> <forms loginUrl="~/Login/Login" timeout="2880" /> </authentication> <roleManager defaultProvider="CustomRoleProvider" enabled="true"> <providers> <clear/> <add name="CustomRoleProvider" type="Talash.CustomRoleProvider" connectionStringName="talasheduEntities" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" /> </providers> </roleManager>
سپس برای صفحه Admin کد زیر را گذاشته ام:
[Authorize(Roles = "SiteManager")]
اما پس از لاگین کردن شخصی با این نقش ، به صفحه ای که درauthentication تعریف شده است می روم.
فکر می کنم خاصیتAuthorize کار نمی کند..
لطفا راهنمایی نمایید
کد ها به نظر مشکلی ندارند
باید چک کنید ببینید اصلا وارد کلاستون میشه و اگر میشه آیا نقش کاربر را درست برمیگردونه
کد زیر را در کلاس Custom provider نوشتم:
public override string[] GetRolesForUser(string username) { string[] f = {""}; var d = (from u in talash.Tbl_User join k in talash.Tbl_RoleInUser on u.UserID equals k.UserID join r in talash.Tbl_Role on k.RoleID equals r.RoleID select new { r.RoleName }); for (int i = 0; i < d.Count(); i++) { f[i] = d.ToArray()[i].RoleName; } return f; }
وارد این متد می شود و متغیر f برابر Sitemanager می شود.
اما پس از اجرای این متد برنامه به کنترلر Login که در قسمت Authenticate مربوط به وب کانفیگ تعریف شده است می پرد.
اطفا راهنمایی نمایید
با تشکر
به حروف کوچک و بزرگ حساس است
آیا این مورد رو رعایت کردید ؟
من بجای username ، کد ملی رو پاس می دم. اسم متغیر فقط username هست
جناب مدائنی بنظرتون مشکل کجا است؟
والا نمیدونم
به نظر همه چی درست میاد
باید کدتون تریس بشه تا مشکل پیدا بشه
باید مراحل رو تک تک بررسی کنید تا متوجه کدام مرحله خطا داره
اگر از Unit Test استفاده کنید این مشکلات پیش نمیاد
اینها رو که نوشتم همش با استفاده از تریس کردن بود.
نمی دانم چرا همش به صفحه لاگین پرش می کند.
لطفاً منبع خوبی در مورد unit test معرفی نمایید
با تشکر
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)