Я использую пользовательский IIdentity
и IPrincipal
в моем ASP.NET MVC
приложения через EF 4.3
в expalined here (и следовать принял решение ответить в). Кроме того, у меня есть обычай RoleProvider
. В местных (с использованием IIS Express
), он работает currectly. Но теперь, когда я загружаю приложение на настоящий хост, кажется, что все пользователи находятся в роли "admin"
! например Я создаю пользователя, которого нет в роли "admin"
, но он может получить доступ ко всем защищенным страницам (для чего нужна роль "admin"
). например Role.IsUserInRole
всегда возвращает true
. У вас есть идеи? Вы можете мне помочь? Есть ли какие-либо настройки, которые я должен делать в IIS
?RoleProvider dosn't работы с пользовательским IIdentity и IPrincipal на сервере
ответ
Я объясняю это решение, и оно работает для меня. Я не сейчас, может быть, вам следует откат к событию AuthenticateRequest
. Если вы хотите попробовать таким образом, вы должны полностью удалить RoleManagerModule
из своего проекта. Попробуйте это и дайте мне знать, если работы или NOP:
// in your module:
public void Init(HttpApplication context) {
_application = context;
// rollback this line:
_application.AuthenticateRequest += ApplicationAuthenticateRequest;
}
// and in web.config
<!-- in system.web section: -->
</system.web>
<!-- other stufs -->
<httpModules>
<remove name="RoleManager"/>
</httpModules>
</system.web>
<!-- and in system.webServer section: -->
<system.webServer>
<!-- other stufs -->
<modules runAllManagedModulesForAllRequests="true">
<remove name="RoleManager"/>
</modules>
<system.webServer>
Если вы хотите продолжать использовать по умолчанию RoleManager, становится трудно. Я попытался создать свой собственный RoleManager, получив значение по умолчанию, без везения. Через 2 дня, пытаясь несколько вещей, я в конечном итоге создать некоторые методы расширения для RolePrincipal:
public static bool IsEmployee(this RolePrincipal principal)
{
if (IsAuthenticated())
return principal.IsInRole("Employee");
return false;
}
public static bool IsAdmin(this RolePrincipal principal)
{
if (IsAuthenticated())
return principal.IsInRole("Admin");
return false;
}
Создан новый класс WebViewPage:
public abstract class BaseViewPage : WebViewPage
{
public virtual new RolePrincipal User
{
get
{
if (base.User == null)
return null;
return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
}
}
}
public abstract class BaseViewPage<TModel> : WebViewPage<TModel>
{
public virtual new RolePrincipal User
{
get
{
if (base.User == null)
return null;
return (RolePrincipal)base.User; //Hard casting: If it goes wrong, it better goes wrong here
}
}
}
Измененный web.config в папке просмотров:
<pages pageBaseType="MyCompany.MyProject.BaseViewPage">
И все мои контроллеры вытекают из моего BaseController:
public abstract class BaseController : Controller
{
protected virtual new RolePrincipal User
{
get { return HttpContext.User as RolePrincipal; }
}
}
Недостатком является то, что методы запрашивают мою базу данных каждый раз, когда они вызываются. Я использую MVC 4 BTW
Надежда это помогает любому
+1 и принять. Он работает снова. Заранее спасибо –
будут ли какие-либо побочные эффекты удаления модуля RolManager –
@taherchhabra Нет, если вы реализуете роль поставщика самостоятельно. Да, если вы хотите использовать поставщика ролей по умолчанию. Для получения дополнительной информации задайте отдельный вопрос. –