О технологиях применения и работе:
Язык программирования: C#
Интерфейсная сторона: Windows Presentation Foundation (WPF) — .NET Framework 4.6.1
Внутренняя сторона: Windows Communication Foundation (WCF) — .NET Framework 4.6.1
Восстановите необходимые пакеты в выбранном проекте, выполните следующую команду в консоли PM.
Update-Package -reinstall
В этом приложении я собираюсь показать, как использовать авторизацию и аутентификацию с помощью службы WCF в стандартах архитектуры предприятия.
WCF
Служба аутентификации ASP.NET
Пользовательская аутентификация
HTTP-файлы cookie
Атрибут Authorization PrincipalPermission
Текущий принцип потока
Перехватчики сообщений
Создайте приложение службы WCF.
Добавьте AuthenticationService.svc, повторно используя службу аутентификации ASP.NET.
Создайте класс средства проверки пользователей.
Включите пользовательскую аутентификацию в Global.asax.
Вернуть файл cookie, если действительный пользователь.
Измените конфигурацию службы.
Создайте файл ExecuteOperationsService.svc с тремя разными методами: SumOperation, ReadOperation и WriteOperation.
Украсьте методы службы атрибутом PrincipalPermission только для авторизованного доступа.
Украсьте класс ExecuteOperationsService атрибутом AspNetCompatibilityRequirements.
Реализуйте перехватчики в серверном приложении.
Внедрите код настройки удостоверения в перехватчики в приложении-службе.
Измените код на стороне службы, включив в него роль вместо имени.
Используйте зашифрованный билет для хранения имени пользователя и ролей.
Создайте клиентское приложение и добавьте ссылки на обе службы.
Реализуйте перехватчики в клиентском приложении.
Создайте экземпляр службы аутентификации и вызовите метод Login().
Получите файл cookie и сохраните его.
Создайте экземпляр ExecuteOperationsService и вызовите SumOperation, ReadOperation и WriteOperation.
Прикрепите файл cookie к клиенту ExecuteOperationsService.
1. Добавьте AuthenticationService.svc, повторно используя службу аутентификации ASP.NET.
Добавьте новую службу WCF и назовите ее AuthenticationService.svc. Удалите связанные файлы, поскольку мы собираемся предоставить доступ к службе аутентификации ASP.NET.
Удалить AuthenticationService.cs
Удалить IAuthenticationService.cs
<%@ ServiceHost Language="C#" Service="System.Web.ApplicationServices.AuthenticationService" Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. Включите пользовательскую аутентификацию в Global.asax и верните файл cookie, если действительный пользователь.
Добавьте в проект новый элемент Web > Global Application Class .
protected void Application_Start (отправитель объекта, EventArgs e) {AuthenticationService.Authentication + = AuthenticationService_Authentication; }
частный недействительный AuthenticationService_Authentication (отправитель объекта, AuthenticationEventArgs e) {string roles = string.Empty; e.Authenticated = UserIsValid(e, ref roles); e.AuthenticationIsComplete = правда; if (e.Authentication) { строка EncryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, roles)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); } }
Этот метод извлекает имя пользователя и пароль из объекта Custom Credential аргумента события аутентификации. Затем он проверяет имя пользователя и пароль с помощью нашего класса UserValidator.
Свойство Authenticated представляет значение true/false, если пользователь действителен или нет соответственно.
3. Включите службу аутентификации и совместимость ASP.NET.
Теперь нам нужно изменить файл web.config, включив в него следующее:
Включить службу аутентификации
Включить совместимость ASP.NET
<система.web.extensions> <сценарий> <веб-сервисы> <authenticationService Enabled="true"/> </веб-сервисы> </скриптинг> </system.web.extensions>
4. Внедрите перехватчики в серверное приложение.
Это связано с тем, что приведенный выше код прикрепления файла cookie к контексту операции кажется утомительной работой каждый раз, когда нам нужно выполнить вызов службы. Мы можем перенести эти задачи на задний план с помощью перехватчиков WCF.
MSDN: Службы данных WCF позволяют приложению перехватывать сообщения запроса, чтобы вы могли добавить к операции собственную логику. Вы можете использовать эту пользовательскую логику для проверки данных во входящих сообщениях. Вы также можете использовать его для дальнейшего ограничения области запроса, например, для вставки пользовательской политики авторизации для каждого запроса.
Ниже приведены действия, выполняемые на этом этапе.
Добавьте поведение перехватчика в файл web.config сервера.
Создайте класс поведения перехватчика. (см. в проекте)
Создайте класс IdentityMessageInspector . (см. в проекте)
<system.serviceModel> <услуги> <service name="AuthenticationAndAuthorization.ExecuteOperationsService" BehaviorConfiguration="InterceptorBehavior" /> </услуги> <поведение> <serviceBehaviors> <поведение> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </поведение> <behavior name="InterceptorBehavior"> <serviceDebug includeExceptionDetailInFaults="true" /> <interceptorBehaviorExtension /> </поведение> </serviceBehaviors> </поведение> <расширения> <behaviorExtensions> <add name="interceptorBehaviorExtension" type="AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, Version=1.0.0.0, Culture=neutral"/> </behaviorExtensions> </расширения> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" MultipleSiteBindingsEnabled="true" /> </system.serviceModel>
5. Шифрование файлов cookie.
Наш файл cookie содержит информацию, которую легко прочитать с помощью утилит проверки HTTP, таких как Fiddler. Это делает информацию cookie уязвимой для угроз безопасности.
FormsAuthenticationTicket : Пространство имен System.Web.Security предоставляет нам удобный класс. Мы можем хранить информацию об имени пользователя и ролях внутри этого экземпляра класса. Класс билета также обеспечивает возможность истечения срока действия и шифрования.
частный FormsAuthenticationTicket CreateFormsAuthenticationTicket(AuthenticationEventArgs e, строковые роли) => new FormsAuthenticationTicket(1, e.UserName, DateTime.Now, DateTime.Now.AddHours(24), true, roles, FormsAuthentication.FormsCookiePath);
строка EncryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, roles)); частный FormsAuthenticationTicket GetDecryptTicket(строка EncryptedTicket) => FormsAuthentication.Decrypt(encryptedTicket);
частный HttpResponseMessageProperty SetSetCookieInResponseChannelHeaders (строка cookieValue) {HttpResponseMessageProperty ответ = новый HttpResponseMessageProperty (); response.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; обратный ответ; }
<режим аутентификации="Формы"> <forms SlidingExpiration="true" name="AuthCookie" Protection="All" timeout="20"/> </аутентификация> <machineKey decryption="AES" validation="SHA1" decryptionKey="1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validationKey="33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. Внедрите перехватчики в клиентское приложение.
Ниже приведены действия, выполняемые на этом этапе.
Добавьте поведение перехватчика внутри Client App.config
Создайте класс поведения перехватчика. (см. в проекте)
Создайте класс CookieMessageInspector . (см. в проекте)
<поведение> <конечная точкаBehaviors> <имя поведения ="InterceptorBehavior"> <interceptorBehaviorExtension /> </поведение> </endpointBehaviors> </поведение>
<адрес конечной точки="http://localhost:8046/ExecuteOperationsService.svc"binding="basicHttpBinding"bindingConfiguration="BasicHttpBinding_IExecuteOperationsService"contract="ExecuteOperationsServiceReference.IExecuteOperationsService" name="BasicHttpBinding_IExecuteOperationsService" BehaviorConfiguration="InterceptorBehavior"/>