У меня есть хранилище SqlMembershipProvider с включенными ролями. Это настроено и имеет «devtest» пользователя в ролях «xxUser» и «xxAdmin».Аутентификация поставщика членства ASP.NET, не работающая при аутентификации службы WCF
У меня также есть служба WCF, с которой я хочу пройти аутентификацию и авторизацию.Моя проблема заключается в том, что:
- разрешение не происходит, код просто выполняет несмотря на атрибут политики
- Я не получаю идентичности или безопасности контекст, так что не знаю, кто вызова службы
мне нужно:
- , чтобы узнать, какой пользователь называет метод
- некоторая степень отклонения пользователей, если разрешения не совпадают (в идеале это должно быть выполнено в пределах RoleProvider/MembershipProvider/WCF , но может сделать это сам, если мне придется)
- SSL в транспорт
Я мой контракт на обслуживание созданы таким образом:
[ServiceContract]
public interface ISupportService
{
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "ThisRoleDoesNotExist")]
List<BaseInterestRate> GetAllBaseInterestRates();
}
код прост е nough:
public class SupportService : ISupportService
{
public List<BaseInterestRate> GetAllBaseInterestRates()
{
OperationContext operationContext = OperationContext.Current;
ServiceSecurityContext serviceSecurityContext = ServiceSecurityContext.Current; // is always null
using (xxxEntities entities = new xxxEntities())
{
return new List<BaseInterestRate>(entities.BaseInterestRates);
}
}}
Моя конфигурация службы таким образом:
->
<behaviors>
<serviceBehaviors>
<behavior name="SupportServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="SqlMembershipProvider" />
</serviceCredentials>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
Уже настроил MembershipProvider:
<membership defaultProvider="SqlMembershipProvider" >
<providers>
<clear/>
<add name="SqlMembershipProvider"
connectionStringName="SqlMembershipProvider"
applicationName="xxx"
type="System.Web.Security.SqlMembershipProvider" />
</providers>
</membership>
<roleManager enabled="true">
<providers>
<clear />
<add connectionStringName="SqlMembershipProvider" applicationName="xxx"
name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
<add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider" />
</providers>
</roleManager>
Я следовал инструкциям на этих страницах письма:
- How to: Use the SQL Server Role Provider with Windows Authentication in WCF Calling from Windows Forms (MSDN)
- How to: Create and Install Temporary Client Certificates in WCF During Development (MSDN)
- How to: Use wsHttpBinding with Username Authentication and TransportWithMessageCredentials in WCF Calling from Windows Forms (MSDN)
- Также весьма полезно найти через SO: Use Asp.Net Membership provider with a WCF .svc service (Alkampfer's Place)
Я бы на чтобы ожидать проблемы с сертификатами/транспорта/и др. сбой с исключениями, но я могу отлаживать право в вызове WCF. У меня нет контекста контекста/контекста пользователя, доступного мне, и когда я использую пользователя не в двух упомянутых ролях (что я делаю в приведенном выше примере кода), я не получаю «выкинутый».
Мое клиентское приложение в настоящее время является веб-приложением, но в конечном итоге также будет служить приложением Windows Forms и набором тестов. В настоящее время я использую сервер ASP.NET WebDev и запускаю .NET 4.0.
Я что-то упустил?
Что такое атрибуты по реализации ISupportService? – Aliostad
В классе реализации нет атрибутов. Я обновил сообщение, чтобы его отразить. –