gpt4 book ai didi

c# - 对 WCF 服务的身份验证未使用 SetAuthCookie 和完整的 .net 客户端维护,但可与 silverlight 一起使用

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:06 28 4
gpt4 key购买 nike

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

在我的网络服务中:

[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 自动生成的 ServiceReference 客户端的一个实例。第一个断言通过但第二个断言失败,即从一个方法调用到下一个方法调用停止登录。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));

最佳答案

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

Silverlight 应用程序在其托管的网页的上下文中运行 - 因此,可以维护 session 信息、cookie 以及您无需手动担心的所有其他事情。

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

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

查看 Silverlight Unit Test Famework Homepage更多信息...

关于c# - 对 WCF 服务的身份验证未使用 SetAuthCookie 和完整的 .net 客户端维护,但可与 silverlight 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7522882/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com