2

単一のコントローラーといくつかのアクションを含む単純なASP.NETMVCサイトがあります。ユーザーは、アクション(Windows認証、コントローラークラスの「承認」属性)にアクセスするためにログインする必要があります。

ブラウザ経由でサイトにアクセスする場合、すべてが正常に機能します。

クライアントでは、System.Net.WebClientを介してサイトにもアクセスしたいと思います。ビューを返す資格情報とすべてのアクションを設定すると、問題なく機能します。

しかし、リダイレクトを試みようとするアクションにアクセスしようとすると(ControllerのRediret()メソッドを使用して)、サーバーは401Unauthorizedを返します。

WebClientとWindows認証の問題について読んだことがありますが、リダイレクト以外はすべて機能するため、ここで見つけたものは当てはまらないようです。

4

2 に答える 2

0

そのため、数週間後、この問題に戻る時間がありました。結局のところ、ASP.NETとはまったく関係がなく、WebClientのせいです。WebClientはリダイレクトに従う前に資格情報をクリアするため、この場合、元の要求は成功しましたが、ターゲットにも認証が必要なため、WebClientがリダイレクト先のページにアクセスしようとしたときにエラーが発生しました。

残念ながら、プロパティを介してこの動作を切り替えることはできません。したがって、私のソリューションは次のようになります。

//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を使用して、手動でリダイレクトに従います。リクエストを行う前に、リクエストを完了するために必要な資格情報を設定しました

于 2013-01-25T20:47:49.063 に答える
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.

したがって、クレデンシャルをリダイレクトで機能させるために必要なのは、NetworkCredentialオブジェクトだけでなくCredentialCacheオブジェクトを作成することだけです。

于 2014-07-02T23:26:23.433 に答える