Как мне вызвать действие 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 ... hasn 'т работал еще ....

Действие 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 (хорошо, что приложение выполняет вызов, но пользователь загружает приложение), а не учетную запись, которую приложение олицетворяет? I '

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

РЕШЕНИЕ ДЛЯ КОММЕНТАРИИ 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)

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