2012-04-30 3 views
1

Контекст:Пользовательские модуль аутентификации внутри MVC3 веб-приложение

У нас есть внутренний веб-приложение Asp.Net, который настроен на использование проверки подлинности Windows. В рамках этого аспекта аутентификации у нас есть HttpModule, который по существу захватывает имя HttpContext.Current.Identity.Name и возвращает объект UserInfo, который попадает в коллекцию HttpContext.Items.

При переносе этого над MVC3 у меня есть базовый контроллер и OnActionExecuting, я вообще не вижу этот элемент UserInfo в коллекции. Любое понимание было бы здорово. Вот мои настройки:

BaseController:

protected override void OnActionExecuting(ActionExecutingContext ctx) 
     { 
      if (ctx.HttpContext.Items["UserInfo"] != null) 
      { 
       UserInfo currentUser = (UserInfo)ctx.HttpContext.Items["UserInfo"]; 
       dynamic viewBag = ctx.Controller.ViewBag; 
       viewBag.CurrentUser = currentUser; 
      } 
      else 
      { 
       // Unauthorized do something 
      }    

      base.OnActionExecuting(ctx); 
     } 

web.config:

<system.web> 
    <httpModules> 
     <add type="WFS.SIG.Client.Security.Authentication.WindowsAuthentication, WFS.SIG.Client.Security" name="AuthenticationModule"/> 
    </httpModules> 
</system.web>.... 

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="AuthenticationModule" type="WFS.SIG.Client.Security.Authentication.WindowsAuthentication, WFS.SIG.Client.Security" /> 
    </modules> 
</system.webServer> 
+0

Взгляните на http://stackoverflow.com/questions/1134442/httpcontext-items-with-asp-net-mvc – Gats

+0

Оказывается, проблема была в HTTP-модуле. Он обслуживал запросы только для файлов .aspx, .svc и .ascx. Для MVC запросчик является контроллером, и он не обслуживает. Теперь элемент UserInfo в коллекции проходит. – VajNyiaj

ответ

0

Я думаю, что ваш код должен выглядеть следующим образом:

protected override void OnActionExecuting(ActionExecutingContext ctx) 
{ 
    if (ctx.HttpContext.Items["UserInfo"] != null) 
    { 
     UserInfo currentUser = (UserInfo)ctx.HttpContext.Items["UserInfo"]; 
     ViewBag.CurrentUser = currentUser; 
    } 
    else 
    { 
     // Unauthorized do something 
    }    
    base.OnActionExecuting(ctx); 
} 

Доступ к HttpContext должен работать как это. Но вы можете напрямую обращаться к ViewBag.

Можете ли вы проверить, действительно ли ваш модуль аутентификации был вызван и хранит объект в HttpContext? Можете ли вы установить точку останова?

+0

Исключено исключение. Проблема в том, что условие «Если» никогда не выполняется, поэтому свойство viewbag никогда не будет установлено. Кажется, что HttpModule никогда не инициализируется. – VajNyiaj

+0

Это правда. Попробуйте установить точку останова в коде HttpModule. Какой тип IIS вы используете? Если IIS 7.x - это встроенный режим? – slfan