4

XML を MVC アプリケーションに送信し、別の XML を応答として受信するコンソール アプリケーションがあります。それは完全に機能しますが、(明らかな理由で) 承認を追加したいと思います。

コンソール アプリケーションのコードは次のとおりです。

using (var wc = new WebClient())
{
    return GetXmlFromBytes(
        wc.UploadData("URL", GetBytesFromXml(xmlToSend))
    );
}

MVC アプリケーションのコードは次のとおりです。

public ActionResult DoSomething()
{
    XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream));
    var response = InsertDataFromXml(xml);
    return File(GenerateFileFromResponse, "text/xml", "result.xml");
}

そして、それは機能します。そこで、承認を実装するために、次のコードを追加しました。

コンソール ( を追加wc.Credentials):

using (var wc = new WebClient())
{
    wc.Credentials = new NetworkCredential("user", "password");
    return GetXmlFromBytes(
        wc.UploadData("URL", GetBytesFromXml(xmlToSend))
    );
}

MVC アプリケーション ( を追加[Authorize]):

[Authorize]
public ActionResult DoSomething()
{
    XElement xml = XElement.Load(new System.IO.StreamReader(Request.InputStream));
    var response = InsertDataFromXml(xml);
    return File(GenerateFileFromResponse, "text/xml", "result.xml");
}

そして、それは機能しません。これを解決するためにこの情報が必要かどうかはわかりませんweb.configが、次の項目があります。

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication> 

実際、MVC アプリケーションが送り返すファイルは、ログオン ページの HTML です。

これを解決するにはどうすればよいですか? にパラメータがありNetworkCredentialsませんか? でインスタンス化できることは知っていdomainますが、MVC アプリケーションのユーザーのドメインが何であるかはわかりません。

そして、確認のために、「ユーザー」と「パスワード」が有効であることを確認しました。

4

3 に答える 3

3

クレデンシャルタイプを混合しています。

wc.Credentials = new NetworkCredential("user", "password");

HTTP認証用です。

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication> 

フォーム認証です。

これらは完全に異なり、互換性はありません。コマンドラインアプリからフォーム認証を使用するのは困難です。リクエストを含むログインページに移動し、ユーザー名とパスワードをPOSTしてから、返された認証Cookieを取得して、後続のリクエストに添付する必要があります。

于 2012-04-05T21:40:41.397 に答える
1

フォーム認証を使用しているため、最初に認証する必要があります。

  1. ログオン Web メソッドを呼び出し、HTTP 応答から認証 Cookie を取得します。
  2. DoSomething メソッドへの 2 番目の HTTP リクエストで認証 Cookie を設定します。

または、ローカル イントラネットを使用している場合は、認証モードを「Windows」に設定してください。

于 2012-04-05T21:38:55.100 に答える
1

フォーム認証に使用できるAuthenticationServiceを作成します。ClientBaseExtensionsクラスを使用すると、WCF サービス クライアントから Cookie を取得できます。この Cookie を他の呼び出しに挿入します...

String cookies = null;
var auth = new AuthenticationServiceClient();
using (new OperationContextScope(auth.InnerChannel))
{
    auth.Login("user", "password", null, true);
    cookies = auth.GetIncomingCookies();
}

ここで、Cookie データをデータ サービスまたは HTTP 呼び出しに挿入します。

http://mytoolkit.codeplex.com/wikipage?title=ClientBaseExtensionsを参照してください。

于 2012-04-05T22:47:21.483 に答える