当使用WebClient访问时,ASP.NET MVC应用程序返回Unauthorized(401)以进行重定向

时间:2012-12-04 17:37:06

标签: .net asp.net-mvc webclient http-redirect unauthorized

我有一个简单的ASP.NET MVC站点,其中包含一个控制器和一些操作。用户需要登录才能访问任何操作(Windows身份验证,控制器类上的“授权”属性)。

通过浏览器访问网站时,一切正常。

在客户端上,我还想通过System.Net.WebClient访问该站点。我设置凭据和返回View工作的所有操作都很好。

但是当我尝试访问尝试进行重定向的操作时(使用Controller的Rediret()方法),服务器返回401 Unauthorized。

我已经阅读过有关WebClient和Windows身份验证的问题,但我发现的东西似乎并不适用于此,因为除了重定向外,一切都有效。

2 个答案:

答案 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对象。