0

IIS上のwcfサービスと通信するasp.netMVCアプリケーションを作成しています。asp.net MVCアプリケーションは、通常のログインメカニズム(ユーザー名、パスワード)で動作します。wcfサービスで(このパスワードとユーザー名を使用して)ログインして、ユーザーのWindowsIDを取得します(wcfサービスのセキュリティはWindowsベースです)

問題は、この方法でasp.net MVCアプリケーションからサービスと通信し、asp.net MVCアプリケーションを可能な限りステートレスに保つ方法です(パスワードをセッション状態にすることは絶対に許可されていません)。

これを行う方法についてのアイデアは非常に高く評価されています。

この図は物事をより明確にするかもしれません: アーキテクチャモバイルアプリのウェブサイト

4

3 に答える 3

1

これは、WCFサービスでユーザー名/パスワードを使用して認証する方法を段階的に説明する記事です。

http://blog.adnanmasood.com/2010/04/29/step-by-step-guide-for-authenticating-wcf-service-with-username-and-password-over-ssl/

サービス側でカスタムUserNamePasswordValidatorを使用します。

public class CustomValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        if (userName == "test" && password == "secret")
        {
            return;
        }
        throw new SecurityTokenException("Unknown Username or Password");
    }
}

これは、サービス動作として構成できます。

<system.serviceModel>
    <services>
        <service behaviorConfiguration="WcfService.Service1Behavior" name="MySamples.WcfService">
            <endpoint address="" binding="wsHttpBinding" contract="MySamples.IWcfService" bindingConfiguration="SafeServiceConf">
                <identity>
                    <dns value="localhost"/>
                </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="WcfService.Service1Behavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true" />
                <serviceCredentials>
                    <userNameAuthentication
                        userNamePasswordValidationMode="Custom"
                        customUserNamePasswordValidatorType="MySamples.CustomValidator, WcfService" 
                    />
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <wsHttpBinding>
            <binding name="SafeServiceConf" maxReceivedMessageSize="65536">
                <readerQuotas maxStringContentLength="65536" maxArrayLength="65536" maxBytesPerRead="65536" />
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>

およびクライアント上:

using (var client = new WcfServiceClient())
{
    client.ClientCredentials.UserName.UserName = "test";
    client.ClientCredentials.UserName.Password = "secret";
    var result = client.SomeMethod();
}
于 2012-08-22T06:19:55.680 に答える
0

私があなたの質問を正しく理解した場合、WCFサービスにWindows認証を提供する方法が必要です。次のリンクが役立ちます。

リンク

于 2012-08-22T06:29:13.073 に答える
0

多くの実験の後、私はこれを行う方法を見つけました。ASP.NETMVCアプリケーションをクライアントと呼びます。

loginServiceを介して、クライアントはユーザー名とパスワードを渡すことができます。このサービスでは、このデータを使用して、対応するWindowsアカウントがあるかどうかを確認します。その場合、GUIDが作成され、このGUIDがユーザー名とパスワード(両方とも暗号化されている)とともにデータベースに保存されます。サービスはGUIDをクライアントに返し、クライアントはこのGUIDをセッション状態にします。

wcfサービスに対して別の呼び出しが行われると、クライアントはこのGUIDを「id」というメッセージヘッダーで送信します。wcfでは、ServiceAuthorizationManagerを使用して着信メッセージを確認します。'id'というメッセージヘッダーがある場合、このIDは、データベース内の対応するユーザー名とパスワードを取得するために使用され、このユーザー名とパスワードを使用してWindowsIDを取得し、それ偽装します(これはすべて、サービス自体に到達する前に行われます)。 )。

ユーザーがサービスにアクセスすると、Windowsアカウントになりすますことができます。

于 2012-08-30T11:41:33.147 に答える