C# IIS授权在向自身发出WebRequest期间不起作用
当使用当前用户凭据调用自身时,我在IIS上尝试在MVC4中获取经过身份验证的响应时遇到问题 我正在使用下面的代码。它只是使用其端口创建一个返回本地服务器的请求,以返回给定页面。注意,将“localhost”更改为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中同时启用了和。它是这样
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¶meter2=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将作为用户进行身份验证,但网站无法作为用户查询自身。