3

うまくいけば、皆さんは私のためにこれのいくつかを明確にすることができます. Sql メンバーシップ プロバイダーを使用する Web アプリケーションがあり、WCF サービスを介して 2 番目の Web アプリケーションと通信します。どちらのアプリケーションも同じ Sql メンバーシップ プロバイダー データストアを共有していますが、ユーザーを認証するために各 WCF サービス呼び出しが必要です。

さて、私は多くのサンプルを見てきましたが、私が見たサンプルでは、​​特定のコードが省略されているように感じます。それは、私には明らかな「はず」であるか、WCF が要求を処理する方法を誤解しています (期待値を参照)。以下のコード)。

どんな助けにも感謝しています...

ここに私がすでに知っている方法があります

  1. 両端で Sql メンバーシップを構成する方法を知っています。
  2. wsHttpBinding のセットアップ方法を知っている
  3. トランスポート セキュリティで使用されるサービス証明書を設定する方法を知っています

これが私が混乱しているものです

  1. メンバーシップパスワードを渡すにはどうすればよいですか (...できません)
  2. 認証 Cookie を渡しますか? もしそうなら、どのように?
  3. ユーザー (自分自身) に関係のない「既知の」ユーザー名とパスワードを作成しますか?

Web クライアントでは、このようなコードが表示されることを期待しています

protected void btnLogin_Click(object sender, EventArgs e)
{
    // Logging into the web-application is known and easy.
    if (Membership.ValidateUser("MyUserName", "MyPassword"))
    {
        FormsAuthentication.SetAuthCookie("MyUserName", true);
        FormsAuthentication.RedirectFromLoginPage("MyUserName", false);
    }
}

protected ServiceReference1.Contractor getContractor(Int32 key)
{
    // I expect something "like" this on the client call.
    MembershipUser user = Membership.GetUser("MyUserName");

    ServiceReference1.FishDataClient wcfService = new ServiceReference1.FishDataClient();

    // You can't retreive the users password directly,
    // nor can you get the hash from the SqlMembershipProvider.
    wcfService.ChannelFactory.Credentials.UserName.UserName = user.UserName;
    // So doing something like this would not be possible.
    wcfService.ChannelFactory.Credentials.UserName.Password = "??????";

    // So how is the web service going to authenticate the user from it's
    // references to the same SqlMembershipProvider (database).
    ServiceReference1.Contractor contractor = wcfService.GetContractor(key);

    wcfService.Close();
    wcfService = null;

    return contractor;
}

WCF サービスでは、このようなコードが表示されることを期待しています

[PrincipalPermission(SecurityAction.Demand, Role = "User")]
public Contractor GetContractor(Int32 key)
{
    ServiceSecurityContext context = ServiceSecurityContext.Current;
    Contractor contractor = new Contractor();

    // What goes here?  I would expect something like this...
    if (Membership.ValidateUser("???????", "???????"))
        contractor.Get(key);

    return contractor;
}
4

2 に答える 2

1

WCF メンバーシップ プロバイダーと Web アプリケーション メンバーシップ プロバイダーが同じバックエンド ユーザー セットを使用していると想定しています。

その場合、アプリケーション間で認証 Cookie を共有する必要があります。その方法の詳細については、こちらを参照してください

次に、Web アプリケーション要求に付属する認証 Cookie を WCF サービス呼び出しに渡す必要があります。ここでその方法を確認できます。

アイデアは、ユーザーが Web アプリケーションにログインし、そうすることで WCF サービスにログインするというものです。

于 2010-08-10T17:24:54.250 に答える
0

以下のリンクの「Transport Security (Trusted Subsystem, HTTP) を使用した Web からリモート WCF へ」を参照してください。答えが見つかると思います。役立つと思われる次のコードもあります。

app.Context.User = new GenericPrincipal(new
       GenericIdentity(username, "Membership Provider"), roles);

また:

NetworkCredential netCred = new NetworkCredential("username", " p@ssw0rd");
asmxwebservice.Service proxy = new asmxwebservice.Service();
proxy.Credentials = netCred;               
proxy.GetData(21, true);

それ以外の場合は、基本に戻ることをお勧めします。そのため、ASP クライアント (asp.net アプリケーション) でメンバーシップとロール プロバイダーを使用するときに、期待される認証と承認の構成が 100% 機能することを確認してください。

次に、WCF サービスのメンバーシップとロールに同じ構成を使用します。唯一の重要な部分は、バインディングが正しく機能することを確認することです。

フォーム認証はまだ試していませんが、最近、IIS でホストされている WCF サービスを呼び出す ASP.NET アプリケーションからの Windows 認証の実装を達成しました。また、構成ファイル (バインディング) のわずかな誤りがアプリケーションの破損を引き起こす可能性があることを発見しました。

ユーザー コンテキストを一般的なプリンシパルに設定することで、WCF サービス側でユーザーの詳細を受け取ることができるはずです。

いくつかの記事の行間を読んで答えを見つけたので、次を確認してください。

お役に立てれば

于 2011-03-04T13:28:09.990 に答える