У меня есть веб-приложение, разработанное в VS с использованием C# с MVC, и у меня есть поставщик роли в роли персонализированной роли. Это успешно работает уже несколько лет. При необходимости роли проверяются с помощью:.NET HttpContext.User возвращает неверный тип объекта
[HttpPost]
[CustomAuthorize(Roles = "admin, dataPerinatal, perinatalAllCases")]
public ActionResult PerinatalDataEntrySummary()
{
IPrincipal principal = HttpContext.User;
bool isAdmin = false;
bool canViewAll = false;
if (principal.IsInRole("admin"))
{
isAdmin = true;
}
else if (principal.IsInRole("perinatalAllCases"))
{
canViewAll = true;
}
// ....
}
Это возвращает principal
как объект типа System.Security.Principal.GenericPrincipal
.
Это работает без проблем.
Однако, я просто добавил новый метод в контроллере же и использовать идентичный код, чтобы получить principal
.
[HttpPost]
public ActionResult FindCaseFromID(string nIMACHCaseID, string mBRRACECaseID)
{
principal = HttpContext.User
bool canViewAll = false;
if (principal.IsInRole("perinatalAllCases"))
{ canViewAll = true; }
// ....
}
Но это возвращает principal
как объект типа System.Web.Security.RolePrincipal
. При этом используется AspNetSqlRoleProvider
и приводит к следующим проблемам:
- Приложение генерирует ошибку «не удается найти сервер SQL» на системах без сервера SQL Express установлен
- Где установлен SQL Express Server
IsInRole
всегда возвращаетfalse
.
Как я могу гарантировать, что каждый экземпляр HttpContext.User
возвращает тип требуемого объекта. Почему второй экземпляр возвращает другой тип объекта, когда все остальное похоже на одно и то же?
RolePrincipal создается, если у вас есть поставщик роли, настроенный в вашем web.config. Это так? –
Нет, это не в web.config, но это настраиваемый поставщик. Как я уже сказал в вопросе, он работает независимо от нового метода. –
Ну, вы можете показать метод, который работает, и метод, который этого не делает? Вы используете области? –