WCF имеет более стандартный способ достижения той же цели через ServiceAuthorizationBehavior .
Если вы установите для его свойства PrincipalPermissionMode значение "Custom", это позволит вам предоставить пользовательский IAuthorizationPolicy
, с помощью которого вы можете сделать пользовательский IPrincipal
доступным для WCF ServiceSecurityContext.DispatchRuntime назначит этот (ваш пользовательский) IPrincipal для Thread.CurrentPrincipal - что вам нужно, верно?
Это пример реализации IAuthorizationPolicy:
public class DemoAuthorizationPolicy : IAuthorizationPolicy
{
private readonly string id = Guid.NewGuid().ToString();
public string Id { get { return this.id; } }
public ClaimSet Issuer { get { return ClaimSet.System; } }
public bool Evaluate(EvaluationContext context, ref object state)
{
// Here, create your custom principal
IIdentity customIdentity = new GenericIdentity("myUserName", "myCustomAuthenticationType");
IPrincipal customPrincipal = new GenericPrincipal(customIdentity, new[] { "user", "powerUser" });
// Set EvaluationContext properties
context.Properties["Identities"] = new List<IIdentity> { customIdentity };
context.Properties["Principal"] = customPrincipal;
return true;
}
}
И этокак вы объявляете ServiceAuthorizationBehavior в Web.config:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthorization principalPermissionMode="Custom" >
<authorizationPolicies>
<add policyType="PrincipalPermissionModeDemo.DemoAuthorizationPolicy, YourAssemblyName"/>
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
Внутри вашего сервиса вы можете использовать декларативную безопасность через атрибут [PrincipalPermission]
, вы можете получить пользовательский IPrincipal из Thread.CurrentPrincipal
, и (альтернативно) вы также можете получить кастом IIdentity от ServiceSecurityContext.Current.PrimaryIdentity
.
Надеюсь, что решит вашу проблему!