2015-08-12 3 views
1

У меня есть веб-приложение, разработанное в 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 и приводит к следующим проблемам:

  1. Приложение генерирует ошибку «не удается найти сервер SQL» на системах без сервера SQL Express установлен
  2. Где установлен SQL Express Server IsInRole всегда возвращает false.

Как я могу гарантировать, что каждый экземпляр HttpContext.User возвращает тип требуемого объекта. Почему второй экземпляр возвращает другой тип объекта, когда все остальное похоже на одно и то же?

+0

RolePrincipal создается, если у вас есть поставщик роли, настроенный в вашем web.config. Это так? –

+0

Нет, это не в web.config, но это настраиваемый поставщик. Как я уже сказал в вопросе, он работает независимо от нового метода. –

+1

Ну, вы можете показать метод, который работает, и метод, который этого не делает? Вы используете области? –

ответ

0

Ответ оказался простой кодовой ошибкой. Все мои контроллеры имеют настраиваемый атрибут [CustomAuthorize] для всего контроллера.

[CustomAuthorize] 
public class MyController : Controller 

который создает HttpContext.User в классе атрибутов.

Первоначальный метод включал проверку роли (см. Выше), однако атрибут отсутствовал в объявлении класса в целом, поэтому второй метод использовал роль поставщика ролей по умолчанию. Как только я добавил атрибут, проблема исчезла.

Смежные вопросы