2010-11-11 6 views
5

Ich bin ziemlich neu in der WCF-Entwicklung und habe ein paar Probleme beim Lernen des Frameworks bekommen. Ich habe eine Service-API, die beide REST & SOAP unterstützen muss. Bisher war dies besonders mit WCF4 und Routing einfach zu implementieren.WCF - Benutzerdefinierte Anmeldeinformationen und Sicherheitstoken

Ich arbeite derzeit auf Genehmigung und haben es geschafft, AuthorizationManager zu erweitern, indem zwei neue Manager-Klassen erstellen: „ApiKeyAuthorizationManager“ & „ApiKeyAndTokenAuthorizationManager“

Die meisten meiner Dienste eine apikey und Token (GUIDS) erfordern anwesend zu sein ; Bei der ersten Authentifizierung benötigen Sie lediglich einen gültigen ApiKey und ein Passwort, um ein Token zu erhalten.

Bis jetzt funktioniert REST perfekt, da die Autorisierungsmanager auf die Abfragezeichenfolge schauen, um ApiKey und/oder Token zu erhalten.

So zum Beispiel ein Service uri würde wie folgt aussehen:? * http://api.domain.com/Service/Operation/ {someVariableValue} apikey = GUID & Token = GUID

Mein Problem kommt jetzt mit SOAP-Dienst Anrufe autorisiert. Ich habe ein wenig Nachforschungen angestellt und bin zu einigen Schlussfolgerungen gekommen, die ich vor der Implementierung überprüfen wollte.

Um SOAP mit benutzerdefinierten Anmeldeinformationen zu autorisieren ich sollte:

  1. individuelle Service-Token erstellen (MSDN)
  2. WCF erweitern indem Sie eine benutzerdefinierte Security, SecurityTokenAuthenticator Erstellen und SecurityTokenSerializer (MSDN)
  3. Extend WCF durch Erstellen benutzerdefinierter AuthorizationPolicies (MSDN)

Bin ich dafür auf dem richtigen Weg? Werden alle diese Schritte benötigt, um zu meinem Szenario zu passen? Scheint so viel Anpassung für nur eine Berechtigung, die aus zwei GUIDs besteht, zu überprüfen.

Vielen Dank!


[EDIT # 1]

Dies hat eine sehr schwierige Aufgabe. Benutzerdefinierte Anmeldeinformationen und Sicherheitstoken sind nahezu undokumentiert. Qualitativ hochwertige Blogposts zu finden, hat sich als nahezu unmöglich erwiesen. Ich habe immer weitergemacht und bin so nah dran, eine funktionierende Lösung zu haben. Ich habe sogar die gleichen Straßenblöcke wie in this post beschrieben getroffen.

Wenn ich versuche, meinen Dienst für den Zugriff auf die WSDL aufzudecken oder mex ich diesen Fehler erhalten:

 
The service encountered an error. 

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.InvalidOperationException: An exception was thrown in a call to a policy export extension. 
Extension: System.ServiceModel.Channels.SymmetricSecurityBindingElement 
Error: Specified argument was out of the range of valid values. 
Parameter name: parameters ----> System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. 
Parameter name: parameters 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateTokenAssertion(MetadataExporter exporter, SecurityTokenParameters parameters, Boolean isOptional) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSignedSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing, AddressingVersion addressingVersion) 
    at System.ServiceModel.Security.WSSecurityPolicy.CreateWsspSupportingTokensAssertion(MetadataExporter exporter, Collection`1 signed, Collection`1 signedEncrypted, Collection`1 endorsing, Collection`1 signedEndorsing, Collection`1 optionalSigned, Collection`1 optionalSignedEncrypted, Collection`1 optionalEndorsing, Collection`1 optionalSignedEndorsing) 
    at System.ServiceModel.Channels.SecurityBindingElement.ExportSymmetricSecurityBindingElement(SymmetricSecurityBindingElement binding, MetadataExporter exporter, PolicyConversionContext policyContext) 
    at System.ServiceModel.Channels.SecurityBindingElement.ExportPolicy(MetadataExporter exporter, PolicyConversionContext context) 
    at System.ServiceModel.Description.MetadataExporter.ExportPolicy(ServiceEndpoint endpoint) 
    --- End of inner ExceptionDetail stack trace --- 
    at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
    at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
    at SyncInvokeGet(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

Wenn Sie eine Idee haben, was könnte die Ursache sein ich etwas Hilfe lieben würde.


[EDIT # 2]

Es scheint Microsoft nicht ihre Proben aktualisieren will zu zeigen, wie WSDL-Datei Unterstützung für benutzerdefinierte Anmeldeinformationen/Token zu ermöglichen. See here. Hat jemand eine Idee, wie man das funktioniert? Was ist der Sinn daran, ein Framework erweiterbar zu machen, wenn es keine Dokumentation gibt, wie es zu erweitern ist?!?


[EDIT # 3]

Wie unten in meinem Kommentar angegeben ... Ich habe TransportWithMessageCredential funktioniert ganz gut UserNameSecurityToken verwenden. Leider erfordern meine Dienste benutzerdefinierte Tokens, wenn es an der Zeit ist, einige erweiterte Funktionen zu implementieren, die ich geplant habe.

Was ich suche als eine Antwort wäre:

Wie benutzerdefinierte Dienstanmeldeinformationen unterstützen und Token mit WSDL-Unterstützung?

Derzeit können Sie den Microsoft-Beispielen folgend nur benutzerdefinierte Anmeldeinformationen verwenden, indem Sie ChannelFactory verwenden und eine benutzerdefinierte Bindung auf dem Client erstellen. Ich würde mich lieber nicht damit befassen.

Wenn diese Frage unbeantwortet bleibt, werde ich das Kopfgeld weiter erhöhen. Sobald alles funktioniert, schreibe ich ein Blog-Tutorial über alle Schritte, die zum Erstellen einer benutzerdefinierten Sicherheitslösung erforderlich sind.

+0

Nun, ich bin auf dem richtigen Weg, aber dies ist eine sehr undokumentierte Bereich in WCF, die ich überraschend finde. Sie können den oben erwähnten MSDN-Artikeln folgen, aber MS stellt auch die Lösungsdateien zur Verfügung, die Sie hier verwenden können: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35ec8682-d5fd-4bc3-a51a -d8ad115a8792 & displaylang = de – Daniel

+0

Ich bin zu dem Schluss gekommen, dass der Return-on-Investment in die Erstellung von benutzerdefinierten Credentials und Tokens die Zeit nicht wert ist, die ich hier einlege. Hoffentlich werden MS in Zukunft in diesem Bereich besser unterstützt. Ich habe entschieden, was ich kann mit Benutzernamen Message Credential-Typ zu tun. Ich lasse diese Frage zur Beantwortung offen und belohne das Kopfgeld, wenn jemand es noch lösen kann. – Daniel

+0

UserNameSecurityToken funktioniert nur für den Moment, obwohl ich am Ende benötigen benutzerdefinierte Token, wenn es an der Zeit ist, einige erweiterte Funktionen, die ich geplant habe zu implementieren. Was ich als Antwort suche, wäre "Wie man benutzerdefinierte Service-Credentials und Tokens mit WSDL-Unterstützung unterstützt". Wenn diese Frage unbeantwortet bleibt, werde ich das Kopfgeld weiter erhöhen. – Daniel

Antwort

5

Ich würde Ihnen raten, auf Windows Identity Foundation zu schauen, und bewegen Sie sich in Richtung Claim-basierte Sicherheit/Föderation. Dieses Modell unterstützt benutzerdefinierte Anmeldeinformationen viel besser, da es sich nur um unterschiedliche Ansprüche handelt.

+0

Ich habe WIF gelernt und habe Vittorio Bertocci's Buch zu diesem Thema gelesen. Ich bin mir jedoch nicht sicher, ob ich hier mein eigenes STS IdP erstellen soll. Werde dies jedoch definitiv als eine Option betrachten. Vielen Dank für Ihre Eingabe. – Daniel