2010-02-11 3 views
0

Je développe actuellement mon propre AuthorizationManager, il ressemble à quelque chose comme ça:AuthorizationManager en fonction des paramètres invocation de service

public class MyAuthorizationManager : ServiceAuthorizationManager 
{ 
    static bool initialize = false; 
    public override bool CheckAccess(OperationContext operationContext) 
    { 
     ServiceSecurityContext context = ServiceSecurityContext.Current; 
     string[] roles = Roles.GetRolesForUser(operationContext.ServiceSecurityContext.PrimaryIdentity.Name); 
     return roles.Count() > 0; 
    } 

    public override bool CheckAccess(OperationContext operationContext, ref System.ServiceModel.Channels.Message message) 
    { 
     MessageBuffer buffer = operationContext.RequestContext.RequestMessage.CreateBufferedCopy(int.MaxValue); 
     message = buffer.CreateMessage(); 
     Console.WriteLine(message); 
     return base.CheckAccess(operationContext, ref message); 
    } 
} 

Je voudrais effectuer une vérification d'autorisation sur la base d'un paramètre de contrat de service, par exemple, si le contrat ressemble à:

[ServiceContract] 
public interface IServerContract 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(ChildTypeOne))] 
    [ServiceKnownType(typeof(ChildTypeTwo))] 
    string SecuredMessage(ParentType incoming); 
} 

Mon but est autorise en fonction du type, dans l'exemple, autorise si la date d'arrivée est ChildTypeOne et deniying au cas où il était ChildTypeTwo.

J'ai vérifié « Message » et il ressemble à:

  • Il doit être déchiffré
  • semble dépendre fortement sur la liaison

est-il un moyen facile d'obtenir simplement type de paramètre?

Répondre

0

Ok, j'ai compris comment effectuer cela. Quoi qu'il en soit, si vous connaissez une meilleure façon de le faire, laissez-moi savoir:

Voici le AuthorizationManager j'utilise:

public class MyAuthorizationManager : ServiceAuthorizationManager 
{ 
    static bool initialize = false; 

    public override bool CheckAccess(OperationContext operationContext, ref System.ServiceModel.Channels.Message message) 
    { 
      bool returnedValue = base.CheckAccess(operationContext, ref message); 
      // messags in WCF are always read-once 
      // we create one copy to work with, and one copy to return back to the plumbing 
      MessageBuffer buffer = operationContext.RequestContext.RequestMessage.CreateBufferedCopy(int.MaxValue); 
      message = buffer.CreateMessage(); 

      // get the username vale using XPath 
      XPathNavigator nav = buffer.CreateNavigator(); 
      StandardNamespaceManager nsm = new StandardNamespaceManager(nav.NameTable); 
      nav = nav.SelectSingleNode("//@i:type",nsm); 
      returnedValue &= (nav.ToString() == "a:"+typeof(ChildTypeOne).Name); 
      return returnedValue; 
    } 


    public class StandardNamespaceManager : XmlNamespaceManager 
    { 
     public StandardNamespaceManager(XmlNameTable nameTable) 
      : base(nameTable) 
     { 
      this.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/"); 
      this.AddNamespace("s11", "http://schemas.xmlsoap.org/soap/envelope/"); 
      this.AddNamespace("s12", "http://www.w3.org/2003/05/soap-envelope"); 
      this.AddNamespace("wsaAugust2004", "http://schemas.xmlsoap.org/ws/2004/08/addressing"); 
      this.AddNamespace("wsa10", "http://www.w3.org/2005/08/addressing"); 
      this.AddNamespace("i", "http://www.w3.org/2001/XMLSchema-instance"); 
     } 
    } 
} 

précédent AuthorizationManager fonctionnera rejeter « ChildTypeTwo ». Vous pouvez utiliser un RoleProvider pour obtenir un rôle basé sur le type.

Questions connexes