У меня есть магазин SqlMembershipProvider с включенными ролями. Это настроено и имеет пользователя «devtest» в ролях «xxUser» и «xxAdmin».
У меня также есть служба WCF, которую я хочу аутентифицировать и авторизовать. Моя проблема в том, что:
- авторизация не
происходит, код просто выполняется
несмотря на атрибут политики
- У меня нет удостоверений или безопасности
контекст, поэтому не знаю, кто
позвонив в службу
Мне нужно:
- чтобы узнать, какой пользователь вызывает
метод
- некоторая степень отказа
пользователи, если разрешения не совпадают
(в идеале это должно быть выполнено
в пределах
RoleProvider / MembershipProvider / WCF
но я могу сделать это сам, если придется)
- SSL в транспорте
Мой контракт на обслуживание составлен таким образом:
[ServiceContract]
public interface ISupportService
{
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "ThisRoleDoesNotExist")]
List<BaseInterestRate> GetAllBaseInterestRates();
}
код достаточно прост:
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" />
Уже настроив ЧленствоПровайдера:
<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>
Я следовал инструкциям на этих страницах к письму:
Я бы ожидал проблемы с сертификатами / транспортом / и т. Д. потерпеть неудачу с исключениями, но я могу отлаживать прямо во время и после вызова WCF. У меня нет доступного мне контекста безопасности / пользовательского контекста, и когда я использую пользователя, не входящего в две упомянутые роли (что я и делаю в приведенном выше примере кода), я не выхожу из игры.
Мое клиентское приложение в настоящее время является веб-приложением, но, в конечном счете, также будет обслуживать приложение Windows Forms и набор тестов. В настоящее время я использую сервер ASP.NET WebDev и использую .NET 4.0.
Я что-то упустил?