2016-01-19 3 views
3

Справочная информация:ASP.NET MVC 5: пул приложений, аутентификация Windows и Active Directory

У меня есть приложение MVC 5/C#, которое взаимодействует с внешним API. Он использует Active Directory пользователей 'Principal Context для авторизации. Приложение проверяет, имеет ли UserPrincipal.Current комбо Un/Pw, хранящееся в Db, которое будет использоваться для любых операций позже внешнего API.

public bool IsUserSetup() 
    { 
     try 
     { 
      // find currently logged in user 
      var user = UserPrincipal.Current; // <- ERRS HERE ----- 
      // check if this user exists in Db with creds 
      if (user != null) 
      { 
       var u = _userProfileRepository.GetUserProfileByUserSID(user.Sid.ToString()); 
       if (u != null 
        && !string.IsNullOrEmpty(u.RallyUsername) 
        && !string.IsNullOrEmpty(u.RallyPassword) 
        && u.IsActive // <-- make sure this person is an active user 
        ) 
       { 
        return true; 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      string exMessage = ex.Message; 
      //throw ex; 
     } 
     return false; 
    } 
  • Я понимаю, что UserPrincipal.Current будет возвращать идентификатор пула приложений в по умолчанию.
  • Я также понимаю, установка IMPERSONATE Истинных IIS будет использовать контекст текущего пользователя, как в: <system.web> <identity impersonate="true"/>...

Однако, если я перехожу олицетворения на (правда), то я получаю это:

An ASP.NET setting has been detected that does not apply in Integrated managed pipeline mode. 

Итак, я изменю app pool использовать «классический» (который я не думаю, что это ответ или путь, который я должен взять), и я получаю эту ошибку:

The page you are requesting cannot be served because of the ISAPI and CGI Restriction list settings on the Web server. 

Очевидно, что это отлично работает в IIS Express, он видит меня (домен \ имя пользователя) просто отлично. Но когда я переключаю его на IIS или развертываю на реальном веб-сервере, я получаю эти проблемы.

Мне нужно получить текущего пользователя/принципала, чтобы я мог хранить их SID и учетные данные во внешнем API в Db. Затем, используя сайт/приложение, он автоматически использует магические средства для работы в API по мере необходимости.

Что мне нужно сделать, чтобы либо:

  • установки IIS, чтобы олицетворения работать
  • настроить свой код, чтобы сделать то же самое

ответ

1

С here, используйте вариант 2, который есть:

<system.webServer> 
    <!--When using 'Integrated Pipeline' on IIS on the server, and if your application does not rely on impersonating the requesting user in the 'BeginRequest' and 'AuthenticateRequest' stages (the only stages where impersonation is not possible in Integrated mode), but still requires Impersonation in other areas of the application, ignore this error (500 - Internal Server Error) by adding the following to your application’s web.config--> 
    <validation validateIntegratedModeConfiguration="false"/> 
</system.webServer> 
+0

ОК, что привело меня к одному конкретному камню преткновения, но это не весь ответ , Как получить текущего пользователя в среде домена AD? –

+0

Вы можете использовать HttpContext.User.Identity –

+0

Нет, я не могу. Если вы имеете в виду System.Web.HttpContext.Current.User.Identity.Name, которое по-прежнему отображается как пустая строка ... Это не должно быть так сложно. –

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