WCF服务的身份验证不是使用SetAuthCookie和一个完整的.net客户端来维护的,而是使用silverlight

本文关键字:客户端 net 维护 一个 silverlight 身份验证 服务 SetAuthCookie WCF | 更新日期: 2023-09-27 18:09:20

我已经设置了一个启用了表单身份验证和AspNetCompatibility的站点。实际的客户端是一个silverlight应用程序,并且工作得很好,但是我想使用normal .net单独对应用程序进行单元测试,以测试服务(对于没有副作用的方法的实时系统)。然而,当我停止使用Silverlight并开始使用完整的。net时,它不会保持身份验证

在web服务中,我有:

[OperationContract]
public bool Login(string Username, string Password, bool isPersistent)
{
    if (Membership.ValidateUser(Username, Password))
    {
        FormsAuthentication.SetAuthCookie(Username, isPersistent);
        return true;
    }
    else
    {
        return false;
    }
}
[OperationContract]
public bool IsLoggedIn()
{
    return HttpContext.Current.User.Identity.IsAuthenticated;
}

然后在客户端的测试方法中,我这样调用它:

Assert.IsTrue(Client.Login("MyUsername","MyPassword", true));
Assert.IsTrue(Client.IsLoggedIn());

客户端是.net自动生成的servicerreference客户端的一个实例。第一个断言通过了,但第二个断言失败了,即从一个方法调用到下一个方法调用,它停止登录。在silverlight应用程序中,类似的方法将通过。

我怎样才能使正常的。net行为正确的silverlight将?有没有更好的方法来配置完整的。net客户端/服务?

请求的附加信息

服务配置:

<services>
  <service behaviorConfiguration="MyBehaviour" name="SSCCMembership.Web.Services.LoginService">
    <endpoint address="" binding="customBinding" bindingConfiguration="customBindingBinary"
      contract="SSCCMembership.Web.Services.LoginService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>
<bindings>
  <customBinding>
    <binding name="customBindingBinary">
      <binaryMessageEncoding />
      <httpTransport />
    </binding>
  </customBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyBehaviour">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />

身份验证配置:

<authentication mode="Forms" />
<membership defaultProvider="OdbcProvider">
  <providers>
    <clear />
    <add name="OdbcProvider" type="SSCCMembership.Web.SimpleMembershipProvider" applicationName="/SSCCMembership" requiresUniqueEmail="false" connectionStringName="mainConn" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" writeExceptionsToEventLog="true" />
  </providers>
</membership>

然后使用以下代码在WPF

中构造客户端
public static T LoadService<T>(string URI, Func<CustomBinding, EndpointAddress, T> F)
{
    try
    {
        Uri U = new Uri(new Uri(Root), URI);
        BinaryMessageEncodingBindingElement binary = new BinaryMessageEncodingBindingElement();
        HttpTransportBindingElement transport;
        if (U.Scheme == "http")
            transport = new HttpTransportBindingElement();
        else if (U.Scheme == "https")
            transport = new HttpsTransportBindingElement();
        else
            throw new Exception(U.Scheme + " is not a recognised URI scheme");
        transport.MaxBufferSize = int.MaxValue;
        transport.MaxReceivedMessageSize = transport.MaxBufferSize;
        transport.AllowCookies = true;
        CustomBinding binding;
        binding = new CustomBinding(binary, transport);

        EndpointAddress address = new EndpointAddress(U);
        return F(binding, address);
    }
    catch (Exception)
    {
        return default(T);
    }
}

我称之为:

var Client = LoadService(ServiceLocation, (b,e)=>new LoginServiceClient(b,e));

WCF服务的身份验证不是使用SetAuthCookie和一个完整的.net客户端来维护的,而是使用silverlight

我认为你遇到的主要问题是由于每个应用程序运行的上下文。

一个Silverlight应用程序运行在它所在的网页的上下文中——因此,它可以维护会话信息、cookie和其他各种你不需要手动担心的东西。

一旦连接到浏览器外运行的应用程序,您的上下文(就asp.net而言)就发生了变化。您是否尝试在浏览器外启用/安装silverlight应用程序以查看是否有相同的错误?

解决这个问题的一种方法是使用Silverlight Unit Test项目并将其连接到您的web服务进行测试。(我已经为我工作的公司成功地完成了企业silverlight应用程序)silverlight单元测试项目的结果是一个可以托管在网页上的silverlight应用程序,并从那里运行-在与任何其他silverlight应用程序相同的上下文中,就ASP.net而言,使您的web服务调用由于上下文而失败的可能性大大降低。

查看Silverlight Unit Test framework主页获取更多信息

IsLoggedIn()方法改为引用ServiceSecurityContext而不是HttpContext:

[OperationContract]
public bool IsLoggedIn()
{
    return ServiceSecurityContext.Current.PrimaryIdentity.IsAuthenticated;
}

我有同样类型的问题,最终只是实现WCF身份验证服务…文档是直截了当的,它与ASP一起工作得很好。. NET表单验证提供程序。
http://msdn.microsoft.com/en-us/library/bb386582.aspx