Я настроил сайт с аутентификацией форм и включенным 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());
Клиент является экземпляром автоматически созданного клиента ServiceReference для .net. Первое утверждение проходит, но второе не проходит, т. е. от одного вызова метода к другому он перестает регистрироваться. Аналогичный метод в приложении 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));
new CustomBinding(new BinaryMessageEncodingBindingElement(), new HttpTransportBindingElement(){ AllowCookies=true })
, но, похоже, это не имеет никакого значения. - person ForbesLindesay   schedule 23.09.2011/configuration/system.web/authentication/forms
), пожалуйста? - person mthierba   schedule 27.09.2011AllowCookies
было установлено значение true). - person mthierba   schedule 27.09.2011