C# IIS授权在向自身发出WebRequest期间不起作用

C# IIS授权在向自身发出WebRequest期间不起作用,c#,asp.net-mvc-4,iis,C#,Asp.net Mvc 4,Iis,当使用当前用户凭据调用自身时,我在IIS上尝试在MVC4中获取经过身份验证的响应时遇到问题 我正在使用下面的代码。它只是使用其端口创建一个返回本地服务器的请求,以返回给定页面。注意,将“localhost”更改为HttpContext.Request.Url.Host没有任何区别 在Dev服务器上的本地机器上,这是可行的。 在我使用IIS的本地机器上,我得到一个401:Unauthorized 在IIS上,我启用了基本身份验证和ASP.Net模拟,并在web.config中同时启用了和。它是这样

当使用当前用户凭据调用自身时,我在IIS上尝试在MVC4中获取经过身份验证的响应时遇到问题

我正在使用下面的代码。它只是使用其端口创建一个返回本地服务器的请求,以返回给定页面。注意,将“localhost”更改为
HttpContext.Request.Url.Host没有任何区别

在Dev服务器上的本地机器上,这是可行的。 在我使用IIS的本地机器上,我得到一个401:Unauthorized

在IIS上,我启用了基本身份验证和ASP.Net模拟,并在web.config中同时启用了
。它是这样配置的,以确保SQL Server(位于另一台计算机上)可以正确地进行身份验证

由于服务器正在调用自身,我不认为这是双跳问题

对于如何使用当前用户身份验证获取针对服务器的身份验证请求,有人有什么建议吗

    [Authorize]
    public ActionResult GetTest()
    {
        try
        {
            string urlAddress = string.Format("http://{0}:{1}/{2}", "localhost", HttpContext.Request.Url.Port, "api/diagnostic/get");

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlAddress);
            request.Proxy = null; // Important! Stops the object searching for settings that cause a big slowdown.
            request.Credentials = CredentialCache.DefaultCredentials;
            request.PreAuthenticate = true;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    using (Stream receiveStream = response.GetResponseStream())
                    {
                        if (receiveStream == null)
                        {
                            throw new Exception("ReceiveStream is null.");
                        }

                        StreamReader readStream = response.CharacterSet == null
                            ? new StreamReader(receiveStream)
                            : new StreamReader(receiveStream, Encoding.GetEncoding(response.CharacterSet));

                        string data = readStream.ReadToEnd();

                        response.Close();
                        readStream.Close();

                        return Content(data);
                    }
                }
            }

            return Content("Error");
        }
        catch (Exception e)
        {
            return Content(e.Message);
        }
    }

您可能需要将验证集成模式配置设置为false

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />

有关原因的解释,请参阅本文:

由于授权不想生效,我不得不绕开它。当我从同一台服务器请求数据时,我不需要创建HttpRequest,我可以直接访问控制器

显然,它比简单的WebRequest要复杂一些,但它的优点是返回类型正是控制器返回的类型

参数的处理可能不完整,但对我来说是有效的

        var httpContext =
            new HttpContextWrapper(
                new HttpContext(
                    new HttpRequest(null, "http://servername/api/diagnostic/get", // interestingly the actual servername is not required.
                        "parameter=1&parameter2=foo"),
                    new HttpResponse(new StringWriter())));

        var routeData = RouteTable.Routes.GetRouteData(httpContext);

        var req = new RequestContext(httpContext, routeData);

        var controller =
            (ControllerBase)
                ControllerBuilder.Current.GetControllerFactory()
                    .CreateController(new RequestContext(httpContext, routeData), routeData.Values["controller"].ToString());

        var context = new ControllerContext(req, controller);

        controller.ControllerContext = context;

        var desc = new ReflectedControllerDescriptor(controller.GetType());

        var action = desc.FindAction(context, routeData.Values["action"].ToString());

        var queryString = httpContext.Request.QueryString;

        var parameters = action.GetParameters()
            .ToDictionary(p => p.ParameterName,
                p =>
                    p.ParameterType.IsEnum
                        ? Enum.ToObject(p.ParameterType, Convert.ChangeType(queryString.GetValues(p.ParameterName)[0], TypeCode.Int32))
                        : Convert.ChangeType(queryString.GetValues(p.ParameterName)[0], p.ParameterType));

        var result = action.Execute(context, parameters);

您的服务器凭据可能无效。请尝试其他凭据,而不是
request.credentials=CredentialCache.DefaultCredentials@KhanhTO谢谢,我添加了一些说明,我需要使用当前用户凭据拨打电话。@KhanhTO但它可以使用模拟对SQL Server、Sharepoint和其他服务进行身份验证,但不能使用其本身?我想你需要@KhanhTO我有。我没有看到任何有用的东西。基本身份验证处于启用状态,因此SQL Server将作为用户进行身份验证,但网站无法作为用户查询自身。