我有一个运行 ASP.Net 会员数据库的网站,它运行良好。我还有一个正在运行的 WCF 服务,它应该充当在网站上实现的应用程序的 API(在我的例子中是游戏)。现在我的问题是我希望我的应用程序能够调用 WCF 并通过我的数据库解决方案返回当前登录到网站的用户,但我无法找到一种方法来为我的生活做这件事。我试过使用:
OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
但是,当它被网站上登录的会话调用时,它似乎没有值(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;
}
网络配置:
<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>
我似乎在该主题上找到的所有信息都与您提供凭据的用户的标准身份验证有关,而我的问题是查找登录我网站的人的凭据。
编辑:
我从错误的角度看待问题。这就是我目前尝试修复它的方式:当用户访问包含应用程序的页面时,我正在生成一个 SessionId,其中包含有关应用程序 ID、访问页面的用户 ID 和会话到期日期的信息(当前日期 + 时间)。您可以明显地将信息直接转发到您托管的 .swf 文件(即:http ://helpx.adobe.com/flash/kb/pass-variables-swfs-flashvars.html ),因此我将用户的 sessionId 传递给应用程序,然后应用程序开发人员可以使用它来访问数据库中用户的名称,方法是将 sessionId 传递给返回熟悉的用户 ID 的 SQL 查询(可以使它也返回名称,但 ID 在我的情况)。如果我使此解决方案起作用,我将更新答案。