2014-01-16 5 views
4

У меня есть приложение MVC5, которое бросает исключение NullReferenceException на сервере при использовании атрибута [Authorize] на контроллере. Приложение использует проверку подлинности на основе форм.Приложение ASP.NET MVC5, бросающее NullReferenceException при авторизации

Производственный сервер - это сервер 2008 SP 2 (.NET 4.5.1 и IIS 7).

Начало трассировки стека является:

[NullReferenceException: Object reference not set to an instance of an object.] 
    System.Web.Mvc.AuthorizeAttribute.AuthorizeCore(HttpContextBase httpContext) +38 
    System.Web.Mvc.AuthorizeAttribute.OnAuthorization(AuthorizationContext filterContext) +293 
    System.Web.Mvc.ControllerActionInvoker.InvokeAuthorizationFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor) +155 

я могу это исправить, установив

<modules runAllManagedModulesForAllRequests="true"> 

Однако я предпочитаю не использовать такой sledgehammer method.

Есть ли более чистый способ устранить эту проблему?

+0

У вас есть в вашем web.config? Также проверьте, нет ли преобразования web.config, которое изменяет режим аутентификации в режиме деблокирования. –

ответ

7

У IIS и IIS Express есть разные поведения для аутентификации запроса. Свойство HttpContext.User.Identity не может быть установлено при выполнении метода AuthorizeAttribute.AuthorizeCore() (следовательно, NullReferenceException) из-за того, что модуль аутентификации не всегда запускается.

Вы можете изменить предварительное условие только для модулей аутентификации, которые вам нужны, а не для загрузки всех модулей для всех запросов. Например, модуль FormsAuthenticationModule имеет: preCondition="managedHandler" по умолчанию.

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="false"> 
    <remove name="FormsAuthentication" /> 
    <remove name="DefaultAuthentication" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition="" /> 
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" preCondition="" /> 
    </modules> 
</system.webServer> 

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

  • Нет связанных вопросов^_^