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 の方が便利です)。私の場合)。このソリューションが機能するようになったら、回答を更新します。