0

ASP.Net メンバーシップ データベースを使用して Web サイトを運営していますが、問題なく動作しています。また、Web サイトに実装されたアプリケーション (私の場合はゲーム) の API として機能する WCF サービスも実行しています。今私の問題は、アプリケーションが WCF を呼び出し、データベース ソリューションを介して現在 Web サイトにログオンしているユーザーを返すことができるようにしたいということです。私の人生でこれを行う方法が見つかりません。私は使用してみました:

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;

しかし、これは、Web サイトにログインしているセッションによって呼び出された場合、値 (null) を持たないようです。アプリケーションの実行中に誰がログインしているかに基づいて、WCF がハイスコアなどを更新できるようにしたいのですが、ログインしている人の身元を把握できない場合、これは私が知る限り不可能です。これは私がこれをテストしようとした方法です:

protected void Page_Load(object sender, EventArgs e)
{
    APIHostClient client = new APIHostClient();
    client.Open();
    String name = client.GetUserName();
    Label.Text = name;
    client.Close();
}

// on the wcf side 
public String GetUserName()
    {
        String userName = OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
        return userName;
    }

web.config:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_IAPIHost" >
          <security mode ="TransportWithMessageCredential">
            <transport clientCredentialType="None"/>
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="https://localhost:2105/APIHost.svc" binding="basicHttpBinding"
        bindingConfiguration="BasicHttpBinding_IAPIHost" contract="ServiceReference1.IAPIHost"
        name="BasicHttpBinding_IAPIHost" />
    </client>
    <services>
      <service behaviorConfiguration="behavior" name="ICanHasGamez.APIHost">
        <endpoint address="" binding="basicHttpBinding" contract="ICanHasGamez.IAPIHost">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>

    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behavior">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceCredentials>
            <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WcfService.SecurityValidator, WcfService"/>
          </serviceCredentials>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

この件に関して私が見つけたと思われるすべての情報は、資格情報を提供するユーザーの標準認証に関連していますが、私の問題は、私の Web サイトにログオンしている誰かの資格情報を見つけることです。

編集:

私は問題を間違った角度から見ていました。これは私が現在それを修正しようとしている方法です: ユーザーがアプリケーションを保持しているページにアクセスしたときに SessionId を生成しています。これには、アプリケーション ID、ページにアクセスしたユーザー ID、およびセッションの有効期限 (現在の日付 + 時刻)。ホストしている .swf ファイルに情報を直接転送できるようです (例: http://helpx.adobe.com/flash/kb/pass-variables-swfs-flashvars.html )。そのため、ユーザーの sessionId をアプリケーション開発者は、データベース内のユーザーの名前にアクセスするために使用できます。これは、sessionId を、よく知っているユーザー ID を返す SQL クエリに渡すことによって行われます (名前も返されるようにすることもできますが、ID の方が便利です)。私の場合)。このソリューションが機能するようになったら、回答を更新します。

4

3 に答える 3

1

これは、このように簡単には機能しません。

あなたがやろうとしているのは、サーバーから WCF を呼び出そうとすることです。これは、呼び出された WCF 要求に呼び出し元の ID を渡すために、サーバーが何らかの方法で要求を偽装する必要があることを意味します。

少なくともいくつかの方法があります。

最も簡単な方法は、リクエストから認証 Cookie (Request.Cookies を介してアクセス可能) を wcf クライアントにコピーすることです。これを行う方法についてブログに書きました

http://netpl.blogspot.com/2011/11/managing-cookies-in-wcf-client.html

これには、Web サイトと wcf (フォーム認証) の両方で同じ認証スキームを再利用できるという利点があるため、wcf は内部要求と外部要求の両方に対して保護されます。

編集:問題があるため、これを行う方法は次のとおりです。

APIHostClient client = new APIHostClient();
client.SetCookie( FormsAuthentication.FormsCookieName, this.Reuqest.Cookies[FormsAuthentication.FormsCookieName].Value );
client.Open();

SetCokie(ブログエントリで説明されているように、WCF 側で実装されていると仮定します)

于 2013-05-26T19:45:28.510 に答える
0

私の編集ソリューションはうまくいきました。sessionId を FlashVars としてフラッシュ ファイルに渡すと、フラッシュ プログラムは一意の sessionId 文字列にアクセスできるようになります。これにより、SQL クエリを介してあらゆる種類の情報に簡単にアクセスできます。同じ .aspx ページを使用して、さまざまなユーザーが接続しているさまざまなアプリケーション (クエリ文字列) を保持するため、パラメーターを操作できるように、フラッシュ オブジェクトをスクリプトに保持する asp.net コードを記述する必要がありました。

hfSessionId = コード ビハインドで SessionId の値に設定された隠しフィールド。

      <script lang="javascript">

            function writeObjectTag() {

                var sessionId = document.getElementById('<%=hfSessionId.ClientID%>').value;

                document.writeln('<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="550" height="400" id="myFlashGame" align="middle">');
                document.writeln('<param name="movie" value="sessionIdDisplayer.swf" />');
                document.writeln(buildParamTag(sessionId));
                document.writeln('<object type="application/x-shockwave-flash" data="sessionIdDisplayer.swf" width="550" height="400">');
                document.writeln('<param name="movie" value="sessionIdDisplayer.swf" />');
                document.writeln(buildParamTag(sessionId));
                document.writeln('<a href="http://www.adobe.com/go/getflash">');
                document.writeln('<img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" />');
                document.writeln('</a>');
                document.writeln('</object>');
                document.writeln('</object>');
            }

            function buildParamTag(value) {
                return '<param name="FlashVars" value="' + value + '" />';
            }

      </script>
于 2013-05-28T22:00:47.140 に答える