我有一个简单的ASP.NET MVC站点,其中包含一个控制器和一些操作。用户需要登录才能访问任何操作(Windows身份验证,控制器类上的“授权”属性)。
通过浏览器访问网站时,一切正常。
在客户端上,我还想通过System.Net.WebClient访问该站点。我设置凭据和返回View工作的所有操作都很好。
但是当我尝试访问尝试进行重定向的操作时(使用Controller的Rediret()方法),服务器返回401 Unauthorized。
我已经阅读过有关WebClient和Windows身份验证的问题,但我发现的东西似乎并不适用于此,因为除了重定向外,一切都有效。
答案 0 :(得分:0)
所以几周后我有时间回到这个问题,事实证明,它与ASP.NET完全无关,而且是WebClient的错。 WebClient在执行重定向之前清除其凭据,因此在这种情况下原始请求成功但是当WebClient尝试访问已重定向到的页面时发生错误,因为目标也需要身份验证。
不幸的是,您不能通过Property切换此行为。所以我的解决方案看起来像这样。
//Credentials necessary for the request(s)
var cred = new NetworkCredential(username, password);
//Create initial request
var request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = false;
request.Credentials = cred;
//Get response to first request
var response = (HttpWebResponse)request.GetResponse();
//Follow redirects
while (response.StatusCode == HttpStatusCode.Redirect && maxRedirects > 0)
{
//Build new URI for redirect target
var uri = response.ResponseUri;
url = String.Format("{0}://{1}:{2}{3}", uri.Scheme, uri.Host, uri.Port, response.GetResponseHeader("Location"));
//Create new request
request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = false;
request.Credentials = cred;
//Get new response
response = request.GetResponse() as HttpWebResponse;
maxRedirects--;
}
//Get the response's content
var sReader = new StreamReader(response.GetResponseStream());
string responseStr = sReader.ReadToEnd();
我没有使用WebClient,而是使用HttpWebRequest和HttpWebResponse,并手动执行Redirect。在发出请求之前,我设置了完成请求所需的凭据
答案 1 :(得分:0)
我在HttpWebRequest代码中找到了一条评论,描述了如何解决这个问题:
// Do _not_ automatically reuse the credential object on a redirection unless
// it is specifically a CredentialCache or SystemNetworkCredential object.
//
// The CredentialCache object stores credentials for specific URIs and
// authentication schemes. Therefore the application has given explicit
// permission to use/send those credentials to a specific site using a
// specific authentication scheme.
//
// A SystemNetworkCredential object represents current default credentials.
// It is deemed safe to reuse them on an automatic redirection since the
// authentication SSP are trusted to only use safe authentication schemes
// for default credentials.
因此,我需要做的就是让我的凭据来处理重定向是创建一个CredentialCache对象,而不仅仅是一个NetworkCredential对象。