Zu den Anwendungstechnologien und der Bedienung:
Programmiersprache: C#
FrontEnd-Seite: Windows Presentation Foundation (WPF) – .NET Framework 4.6.1
BackEnd-Seite: Windows Communication Foundation (WCF) – .NET Framework 4.6.1
Um die erforderlichen Pakete für das ausgewählte Projekt wiederherzustellen, führen Sie den folgenden Befehl in der PM-Konsole aus
Update-Package -reinstall
In dieser Anwendung werde ich zeigen, wie Autorisierung und Authentifizierung mithilfe eines WCF-Dienstes in Enterprise Architecting-Standards verwendet werden.
WCF
ASP.NET-Authentifizierungsdienst
Benutzerdefinierte Authentifizierung
HTTP-Cookies
Autorisierungs-PrincipalPermission-Attribut
Thread CurrentPrincipal
Nachrichtenabfangjäger
Erstellen Sie eine WCF-Dienstanwendung.
Fügen Sie einen AuthenticationService.svc hinzu, der den ASP.NET-Authentifizierungsdienst wiederverwendet.
Erstellen Sie eine User Validator-Klasse.
Aktivieren Sie die benutzerdefinierte Authentifizierung in Global.asax.
Cookie zurückgeben, wenn gültiger Benutzer.
Dienstkonfiguration ändern.
Erstellen Sie eine ExecuteOperationsService.svc mit drei verschiedenen Methoden namens SumOperation, ReadOperation und WriteOperation.
Dekorieren Sie Dienstmethoden mit dem PrincipalPermission-Attribut nur für autorisierten Zugriff.
Dekorieren Sie die ExecuteOperationsService-Klasse mit dem AspNetCompatibilityRequirements-Attribut.
Implementieren Sie Interceptors in der Serveranwendung.
Implementieren Sie den Identitätseinstellungscode für Interceptors in der Serviceanwendung.
Ändern Sie den dienstseitigen Code so, dass er „Rolle“ anstelle von „Name“ enthält.
Verwenden Sie ein verschlüsseltes Ticket zum Speichern von Benutzernamen und Rollen.
Erstellen Sie die Clientanwendung und fügen Sie Verweise auf beide Dienste hinzu.
Implementieren Sie Interceptors in der Clientanwendung.
Erstellen Sie eine Instanz des Authentifizierungsdiensts und rufen Sie die Methode Login() auf.
Empfangen Sie das Cookie und speichern Sie es.
Erstellen Sie eine ExecuteOperationsService-Instanz und rufen Sie SumOperation, ReadOperation und WriteOperation auf.
Hängen Sie das Cookie an den ExecuteOperationsService-Client an
1. Fügen Sie einen AuthenticationService.svc hinzu, der den ASP.NET-Authentifizierungsdienst wiederverwendet.
Fügen Sie einen neuen WCF-Dienst hinzu und nennen Sie ihn AuthenticationService.svc. Löschen Sie die zugehörigen Dateien, da wir den ASP.NET-Authentifizierungsdienst verfügbar machen.
Löschen Sie AuthenticationService.cs
Löschen Sie IAuthenticationService.cs
<%@ ServiceHost Language="C#" Service="System.Web.ApplicationServices.AuthenticationService" Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. Aktivieren Sie die benutzerdefinierte Authentifizierung in Global.asax und geben Sie bei gültigem Benutzer ein Cookie zurück.
Fügen Sie dem Projekt ein neues Element „Web“ > „Globale Anwendungsklasse“ hinzu.
protected void Application_Start(object sender, EventArgs e) { AuthenticationService.Authenticating += AuthenticationService_Authenticating; }
private void AuthenticationService_Authenticating(object sender, AuthenticatingEventArgs e) { string roles = string.Empty; e.Authenticated = UserIsValid(e, ref Roles); e.AuthenticationIsComplete = true; if (e.Authenticated) { string EncryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, Roles)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); } }
Die Methode extrahiert den Benutzernamen und das Passwort aus dem benutzerdefinierten Anmeldeinformationsobjekt des Authentifizierungsereignisarguments. Anschließend validiert es den Benutzernamen und das Passwort mit unserer UserValidator-Klasse.
Die Eigenschaft Authenticated stellt wahr/falsch dar, ob ein Benutzer gültig ist oder nicht.
3. Aktivieren Sie den Authentifizierungsdienst und die ASP.NET-Kompatibilität
Jetzt müssen wir die Datei web.config so ändern, dass sie Folgendes enthält:
Aktivieren Sie den Authentifizierungsdienst
Aktivieren Sie die ASP.NET-Kompatibilität
<system.web.extensions> <scripting> <webServices> <authenticationService aktiviert="true"/> </webServices> </scripting> </system.web.extensions>
4. Implementieren Sie Interceptors in der Serveranwendung.
Dies liegt daran, dass der obige Code zum Anhängen eines Cookies an den Operationskontext jedes Mal, wenn wir einen Serviceaufruf durchführen müssen, eine mühsame Aufgabe zu sein scheint. Wir können diese Aufgaben mithilfe von WCF-Interceptors in den Hintergrund verschieben.
MSDN: WCF Data Services ermöglicht einer Anwendung das Abfangen von Anforderungsnachrichten, sodass Sie einem Vorgang benutzerdefinierte Logik hinzufügen können. Mit dieser benutzerdefinierten Logik können Sie Daten in eingehenden Nachrichten validieren. Sie können es auch verwenden, um den Umfang einer Abfrageanforderung weiter einzuschränken, beispielsweise um eine benutzerdefinierte Autorisierungsrichtlinie für jede einzelne Anforderung einzufügen.
Im Folgenden sind die Aktivitäten aufgeführt, die an diesem Schritt beteiligt sind.
Fügen Sie Interceptor-Verhalten in Server web.config hinzu.
Erstellen Sie die Interceptor Behavior-Klasse. (Siehe im Projekt)
Erstellen Sie die IdentityMessageInspector -Klasse. (Siehe im Projekt)
<system.serviceModel> <Dienste> <service name="AuthenticationAndAuthorization.ExecuteOperationsService" behaviourConfiguration="InterceptorBehavior" /> </services> <Verhalten> <serviceBehaviors> <Verhalten> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> <Verhaltensname="InterceptorBehavior"> <serviceDebug includeExceptionDetailInFaults="true" /> <interceptorBehaviorExtension /> </behavior> </serviceBehaviors> </Verhalten> <Erweiterungen> <behaviorExtensions> <add name="interceptorBehaviorExtension" type="AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, Version=1.0.0.0, Culture=neutral"/> </behaviorExtensions> </extensions> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </system.serviceModel>
5. Cookie-Verschlüsselung.
Unser Cookie enthält Informationen, die von HTTP-Prüfdienstprogrammen wie Fiddler leicht gelesen werden können. Dies macht die Cookie-Informationen anfällig für Sicherheitsbedrohungen.
FormsAuthenticationTicket : Der System.Web.Security-Namespace bietet eine praktische Klasse für uns. Wir können den Benutzernamen und die Rolleninformationen in dieser Klasseninstanz speichern. Die Ticketklasse bietet außerdem Ablauf- und Verschlüsselungsmöglichkeiten.
private FormsAuthenticationTicket CreateFormsAuthenticationTicket(AuthenticatingEventArgs e, string Roles) => new FormsAuthenticationTicket(1, e.UserName, DateTime.Now, DateTime.Now.AddHours(24), true, Roles, FormsAuthentication.FormsCookiePath);
string EncryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, Roles)); private FormsAuthenticationTicket GetDecryptTicket(stringcodedTicket) => FormsAuthentication.Decrypt(encryptedTicket);
private HttpResponseMessageProperty SetSetCookieInResponseChannelHeaders(string cookieValue) { HttpResponseMessageProperty Response = new HttpResponseMessageProperty(); Response.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; Rückantwort; }
<authentication mode="Forms"> <forms slideExpiration="true" name="AuthCookie" Protection="All" timeout="20"/> </authentication> <machineKey decryption="AES" validation="SHA1" decryptionKey="1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validationKey="33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. Implementieren Sie Interceptors in der Clientanwendung.
Im Folgenden sind die Aktivitäten aufgeführt, die an diesem Schritt beteiligt sind.
Fügen Sie Interceptor-Verhalten in Client App.config hinzu
Erstellen Sie die Interceptor Behavior-Klasse. (Siehe im Projekt)
Erstellen Sie die CookieMessageInspector -Klasse. (Siehe im Projekt)
<Verhalten> <endpointBehaviors> <Verhaltensname ="InterceptorBehavior"> <interceptorBehaviorExtension /> </behavior> </endpointBehaviors> </behaviors>
<endpoint address="http://localhost:8046/ExecuteOperationsService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IExecuteOperationsService" Contract="ExecuteOperationsServiceReference.IExecuteOperationsService" name="BasicHttpBinding_IExecuteOperationsService" behaviourConfiguration="InterceptorBehavior"/>