Как мне вызвать действие MVC через WebRequest и проверить запрос через Active Directory?

Я знаю, что название это полный рот. У меня уже есть большинство вещей. Мне просто нужно подтверждение, если я могу сделать то, что я пытаюсь.

Я использую ASP.NET MVC 3. У меня есть одно приложение, которое имеет контроллер, который я использую как веб-сервис. На контроллере есть единственный метод, и он возвращает строку, которая является json. Этот метод аутентифицирует пользователя по активному каталогу.

Приложение, которое выполняет WebRequest для вышеупомянутого, также является приложением MVC. Это приложение (для запроса AD без определенного имени пользователя и пароля) использует олицетворение в файле web.config. Приложение олицетворяет учетную запись, которая имеет разрешение на запрос AD; однако информация пользователя на странице (например, в каких группах они находятся) - это то, против чего я проверяю.

Короче говоря (и я не совсем понимаю эту часть), олицетворение строго так, чтобы ASP.NET мог запрашивать Active Directory. Пользователи, загружающие страницу, по-прежнему видят себя, когда я запрашиваю информацию в активном каталоге.

Код AD выглядит следующим образом (этот код работает):

   public static ADUserInfo GetUserInfo(IPrincipal User)
    {
        StringBuilder userAdInfo = new StringBuilder();
        ADUserInfo userInfo = new ADUserInfo();
        String domain = ConfigurationManager.AppSettings["ADdomain"];

        try
        {
            using (var context = new PrincipalContext(ContextType.Domain, domain))
            {
                if (User == null)
                    userAdInfo.AppendLine("User is null.");
                else if (User.Identity == null)
                    userAdInfo.AppendLine(" User is not null. User.Identitiy is.");
                else
                    userAdInfo.AppendLine(" Neither User nor User.Identity is null. " +
                        User.Identity.Name);

                using (var user = UserPrincipal.FindByIdentity(context, User.Identity.Name))
                {
                    userInfo.FullName = user.Name;
                    userInfo.Email = user.EmailAddress;
                    userInfo.AssociateId = user.EmployeeId;
                    userInfo.DomainName = User.Identity.Name;
                    userInfo.SamAccountName = user.SamAccountName;
                    userInfo.DistinguishedUserName = user.DistinguishedName;
               }
            }
        }
        catch (Exception e)
        {
            LogUtil.WriteException(e);
        }
        return userInfo;
    }

Сайт IIS для этого приложения не разрешает анонимный доступ.

Сервисный метод, который использует информацию AD, работает нормально. Кажется, проблема заключается в передаче учетных данных через WebRequest для вызова этого метода и возврата JSON.

Мой код WebRequest для вызова действия выглядит так:

    public class WebRequestUtil
    {
        public static StreamReader GetWebRequestStream(
             string url,
             string contentType,
             bool useDefaultCredentials)
        {
            var request = WebRequest.Create(url);
            request.ContentType = contentType;
            request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
            //request.UseDefaultCredentials = useDefaultCredentials;
            //ICredentials ic = new NetworkCredential();

            //request.Credentials = 
            var response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream());
        }
    }

Я играю с ImpersonationLevel ... еще не работал ....

Действие MVC 3, вызываемое через WebRequest, выглядит примерно так:

public class ProxyServiceController : Controller
    {

        public ProxyServiceController()
        {

        }

       public string CheckForProxy(string applicationName, string associateId)
        {
            RequestResultDetails requestDetails = new RequestResultDetails();
            string json = string.Empty;

            //This correctly gets the Active directory information for the user
            //and fills out a custom ADUserInfo object.
            **ADUserInfo adUserInfo = ADService.GetUserInfo(this.User);**

            try
            {

                if (!ADService.DoesUrlDataMatchAD(
                                adUserInfo,
                                associateId)
                    )
                {
                    throw new Exception(StaticText.UserDataMismatch);
                }

                resultList = //query db for data given the associateId

                if (resultList.ListIsNotNullOrEmpty())
                {
                    requestDetails.RelationshipExists = true;
                }
                else
                {
                    requestDetails.RelationshipExists = false;
                }

                requestDetails.Details = resultList;

            }
            catch (Exception e)
            {
                LogUtil.WriteException(e);
                requestDetails.ErrorProcessingRequest = true;
                requestDetails.ErrorDetails = ErrorProcessing.GetFullExceptionDetails(e);
            }

            json = JsonConvert.SerializeObject(requestDetails);

            LogUtil.Write("json: " + json);

            return json;

        }
}       

Так что же происходит, если я перехожу к контроллеру / действию MVC 3 непосредственно в браузере через URL-адрес, например:

Http: //: 90 / MyApp / Service.aspx / CheckForProxy / Отчетность / 555

Я вижу правильный JSON на странице. Однако, если я сделаю вызов WebRequest по тому же URL-адресу из другого приложения, находящегося на том же сервере, Active Directory, похоже, не может быть опрошен. Это определенно какая-то проблема с разрешениями, но я не знаю, как ее решить, чтобы служба видела информацию Active Directory пользователя.

Проблема здесь заключается в том, что учетные данные, передаваемые службе, являются учетными данными, которые вызывающее приложение олицетворяет. Что я могу изменить, чтобы приложение mvc службы могло видеть пользователя, выполняющего WebRequest (хорошо, что приложение выполняет вызов, но пользователь загружает приложение), а не учетную запись, которую приложение олицетворяет?

Я открыт для других мыслей или методов обработки этого общения.

РЕШЕНИЕ ДЛЯ КОММЕНТАРИИ JMRNET

Вау, этот комментарий был на месте. Я понятия не имею, какой вид веб-магии работает, но я изменил свой метод веб-запроса, чтобы:

  public static StreamReader GetWebRequestStream(
         string url,
         string contentType,
         bool useDefaultCredentials,
         IPrincipal user)
    {

        var impersonationContext = ((WindowsIdentity)user.Identity).Impersonate();            
        var request = WebRequest.Create(url);

        try
        {
            request.ContentType = contentType;
            request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
            request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
            var response = (HttpWebResponse)request.GetResponse();
            return new StreamReader(response.GetResponseStream());
        }
        catch (Exception e)
        {
            impersonationContext.Undo();
            throw e;
        }

    }

И это точно передает личность основного пользователя.

Ответы на вопрос(1)

Ваш ответ на вопрос