4

Я использую пользовательский 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 на сервере

ответ

5

Я объясняю это решение, и оно работает для меня. Я не сейчас, может быть, вам следует откат к событию 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> 
+0

+1 и принять. Он работает снова. Заранее спасибо –

+0

будут ли какие-либо побочные эффекты удаления модуля RolManager –

+0

@taherchhabra Нет, если вы реализуете роль поставщика самостоятельно. Да, если вы хотите использовать поставщика ролей по умолчанию. Для получения дополнительной информации задайте отдельный вопрос. –

0

Если вы хотите продолжать использовать по умолчанию 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

Надежда это помогает любому