Разработка системы аутентификации "Контекстум-ID"

Способы аутентификации и их применимость относительно системы. Проектирование таблицы в базе данных Identity. Регистрация пользователя и управление паролем. Реализация идентификационного сервиса в качестве основы системы. Триггер для репликации.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 20.10.2016
Размер файла 2,9 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

DiscoveryServiceController служит для определения Сервиса поставщика, от которого поступает запрос на идентификацию пользователя.

MetataController и FederationController служат для инициализации основных конфигурационных параметров идентификационного сервиса для отправки ответа Сервису-поставщику. Реализация данных контроллеров приведена в приложении 8.

IdPController реализует подготовку данных и принимает запрос на идентификацию пользователя, а также перенаправляет ответ Сервису-поставщику в случае успешного прохождения пользователем процедур идентификации и аутентификации. Реализация контроллера приведена в приложении 9.

В таблицах 5.1-5.2 приводятся примеры запроса от Сервиса-поставщика и ответа данному сервису в терминах протокола SAML 2.0.

Таблица 5.1 - Запрос на авторизацию в терминах SAML 2.0

<saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" ID="id8fafddc8ee1c406a90ac8ba19f04cc08" Version="2.0" IssueInstant="2016-05-19T16:32:31Z" Destination="http://localhost:65432/" AssertionConsumerServiceURL="http://localhost:2181/AuthServices/Acs">

<saml2:Issuer>http://localhost:2181/AuthServices</saml2:Issuer>

</saml2p:AuthnRequest>

Таблица 5.2 - Ответ от IdP в терминах SAML 2.0

<samlp:Response ID="_257f9d9e9fa14962c0803903a6ccad931245264310738"

IssueInstant="2009-06-17T18:45:10.738Z" Version="2.0">

<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">

https://www.salesforce.com

</saml:Issuer>

<samlp:Status>

<samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>

</samlp:Status>

<saml:Assertion ID="_3c39bc0fe7b13769cab2f6f45eba801b1245264310738"

IssueInstant="2009-06-17T18:45:10.738Z" Version="2.0">

<saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">

https://www.salesforce.com

</saml:Issuer>

<saml:Signature>

<saml:SignedInfo>

<saml:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>

<saml:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>

<saml:Reference URI="#_3c39bc0fe7b13769cab2f6f45eba801b1245264310738">

<saml:Transforms>

<saml:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>

<saml:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">

<ec:InclusiveNamespaces PrefixList="ds saml xs"/>

</saml:Transform>

</saml:Transforms>

<saml:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>

<saml:DigestValue>vzR9Hfp8d16576tEDeq/zhpmLoo=

</saml:DigestValue>

</saml:Reference>

</saml:SignedInfo>

<saml:SignatureValue>

AzID5hhJeJlG2llUDvZswNUrlrPtR7S37QYH2W+Un1n8c6kTC

Xr/lihEKPcA2PZt86eBntFBVDWTRlh/W3yUgGOqQBJMFOVbhK

M/CbLHbBUVT5TcxIqvsNvIFdjIGNkf1W0SBqRKZOJ6tzxCcLo

9dXqAyAUkqDpX5+AyltwrdCPNmncUM4dtRPjI05CL1rRaGeyX

3kkqOL8p0vjm0fazU5tCAJLbYuYgU1LivPSahWNcpvRSlCI4e

Pn2oiVDyrcc4et12inPMTc2lGIWWWWJyHOPSiXRSkEAIwQVjf

Qm5cpli44Pv8FCrdGWpEE0yXsPBvDkM9jIzwCYGG2fKaLBag==

</saml:SignatureValue>

<saml:KeyInfo>

<saml:X509Data>

<saml:X509Certificate>

MIIEATCCAumgAwIBAgIBBTANBgkqhkiG9w0BAQ0FADCBgzELM

[Certificate truncated for readability...]

</saml:X509Certificate>

</saml:X509Data>

</saml:KeyInfo>

</saml:Signature>

<saml:Subject>

<saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified">

saml01@salesforce.com

</saml:NameID>

<saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">

<saml:SubjectConfirmationData NotOnOrAfter="2009-06-17T18:50:10.738Z"

Recipient="https://login.salesforce.com"/>

</saml:SubjectConfirmation>

</saml:Subject>

<saml:Conditions NotBefore="2009-06-17T18:45:10.738Z"

NotOnOrAfter="2009-06-17T18:50:10.738Z">

<saml:AudienceRestriction>

<saml:Audience>https://saml.salesforce.com</saml:Audience>

</saml:AudienceRestriction>

</saml:Conditions>

<saml:AuthnStatement AuthnInstant="2009-06-17T18:45:10.738Z">

<saml:AuthnContext> <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified

</saml:AuthnContextClassRef>

</saml:AuthnContext>

</saml:AuthnStatement>

<saml:AttributeStatement>

<saml:Attribute Name="portal_id">

<saml:AttributeValue xsi:type="xs:anyType">060D00000000SHZ

</saml:AttributeValue>

</saml:Attribute>

<saml:Attribute Name="organization_id">

<saml:AttributeValue xsi:type="xs:anyType">00DD0000000F7L5

</saml:AttributeValue>

</saml:Attribute>

<saml:Attribute Name="ssostartpage"

NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">

<saml:AttributeValue xsi:type="xs:anyType">

http://www.salesforce.com/security/saml/saml20-gen.jsp

</saml:AttributeValue>

</saml:Attribute>

<saml:Attribute Name="logouturl"

NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">

<saml:AttributeValue xsi:type="xs:string">

http://www.salesforce.com/security/del_auth/SsoLogoutPage.html

</saml:AttributeValue>

</saml:Attribute>

</saml:AttributeStatement>

</saml:Assertion>

</samlp:Response>

6. Проверка работоспособности системы

Для того, чтобы убедиться в работоспособности механизма единой аутентификации при помощи созданного сервиса идентификации на локальной машине были развернуты 2 сервиса:

идентификационный,

веб-сайт, реализованный с применением фреймворка ASP.NET MVC.

Выбор технологии реализации тестового сайта был обусловлен тем, что два Сервиса из имеющихся написаны с применением того же фреймворка.

На рисунке 6.1 представлена стандартная страница входа, которую видит «незалогиненный» пользователь. Данная страница не имеет определенного дизайна, так как несет нагрузку лишь тестового Сервиса, демонстрирующего работу любого другого Сервиса из описанных во введении при его подключении к поставщику идентификации.

Рисунок 6.1 - Стартовая страница Сервиса для неавторизованного пользователя

После нажатия пользователем кнопки «Sign In» происходит перенаправление пользователя в Сервис идентификации, причем до того, как непосредственно перенаправить пользователя на страницу ввода учетных данных происходят процессы, скрытые от глаз пользователя, такие как регистрация метаданных и определение сервиса-поставщика. На рисунке 6.2 представлена страница входа в систему единой аутентификации, которая в дальнейшем позволит пользователем однократно войти в систему и пользоваться любым из Сервисом, взаимосвязанных с системой единого входа. Продемонстрированная страница не является конечной страницей, которая будет доступна для глаз пользователя, так как в нижней части формы приведена техническая информация, необходимая для обмена утверждениями между Сервисами по протоколу SAML 2.0.

Рисунок 6.2 - Форма входа в систему на сайте идентификационного сервиса

В результате успешного ввода корректных учетных данных в форме логина пользователь будет переброшен обратно на Сервис-поставщик. На рисунке 6.3 представлен пример страницы, на которую попадет пользователь после успешного прохождения процедуры аутентификации. На странице приведен список некоторых данных, которые вернул сервис идентификации в качестве необходимой информации для работы пользователя в системе.

Рисунок 6.3 - Страница Сервиса-поставщика после прохождения авторизации

Также следует отметить, что в рамках идентифкационного сервиса была реализована возможность аутентификации через стороний поставщик идентификационных данных. В данном случае продемонстрированы такие поставщики, как Google, Facebook и тестовый сервис Kentor, осуществляющий авторизацию пользователя также по протоколу SAML (рисунок 6.4).

Рисунок 6.4 - Вход при помощи OpenID-провайдера

На рисунке 6.5 продемонстрирован пример авторизации через сервис Google. При успешном входе в систему пользователь также будет переброшен на Сервис-поставщик.

Рисунок 6.5 - Авторизация с помощью Google

Заключение

Решение задачи проектирования и внедрения системы сквозной аутентификации не является новым. Напротив - внедрение такой системы - это распространенная и довольно популярная практика для распределенных систем. Тем не менее, проблема построения системы единого входа является индивидуальной для каждой системы в отдельности и зависит от многих исходных условий, которые накладываются на систему в связи со спецификой ее уже существующих компонентов.

В данной работе было важно выбрать правильный и рабочий подход для проектирования, разработки и внедрения системы однократного входа. Существует широкий выбор технологий, фреймворков, протоколов, стандартов, которые могут послужить фундаментом для построения системы единой аутентификации пользователей, но данный спектр был проанализирован и сведен к минимальному набору необходимых техник и стандартов, исходя из первоначальных условий построения такой системы.

Данная работа охватывает практически все этапы жизненного цикла системы, а также предусматривает работу как над внутренней логикой непосредственно идентификационного сервиса, так и над установлением канала взаимодействия между разработанным сервисом и описанными во введении Сервисами-поставщиками.

В данной работе была спроектирована, реализована, а также продемонстрирована успешная работа системы. Результаты работы имеют высокую практическую ценность и применимость для всех заявленных сервисов как с точки зрения пользователей, так и с точки зрения компаний-участников данной системы, в том числе существует возможность некоторых материальных выгод от объединения абсолютно разрозненных системы в некую структуру с применением SAML - спецификаций в качестве безопасного способа взаимодействия.

Список использованных источников

1. Аликберов, А.А. Что такое cookies и как с ними работать [Электронный ресурс]/ А.А. Аликберов. - 1998. - Режим доступа: http://citforum.ru/internet/html/cookie.shtml (дата обращения: 1.05.2016).

2. Identity provider [Электронный ресурс]. - Режим доступа: https://en.wikipedia.org/wiki/Identity_provider (дата обращения: 1.05.2016).

3. Service provider [Электронный ресурс]. - Режим доступа: https://en.wikipedia.org/wiki/Service_provider (дата обращения: 1.05.2016).

4. Система сквозной однократной аутентификации SecureLogin от ActivIdentity [Электронный ресурс]. - Режим доступа: http://www.rnbo.ru/press-center/news219.php (дата обращения: 1.05.2016).

5. Разработка Архитектура REST [Электронный ресурс]. - Режим доступа: https://habrahabr.ru/post/38730/ (дата обращения: 1.05.2016).

6. Трегубов, А. Однократная аутентификация (Single Sign-On). Основные понятия и существующие решения [Электронный ресурс] / А. Трегубов. - Режим доступа: http://www.croc.ru/i/presentation/presentation_92.pdf (дата обращения: 1.05.2016).

7. Информационная технология «Контекстум» [Электронный ресурс]. - Режим доступа: http://rucont.ru/chapter/technology (дата обращения: 1.05.2016).

8. Руконтекст [Электронный ресурс]. - Режим доступа: http://text.rucont.ru/ (дата обращения: 1.05.2016).

9. О проекте РУАЭСТ [Электронный ресурс]. - Режим доступа: http://ruaest.ru/Home/About (дата обращения: 1.05.2016).

10. Центральный коллектор библиотек "БИБКОМ" [Электронный ресурс]. - Режим доступа: http://www.ckbib.ru/libraries/databases (дата обращения: 1.05.2016).

11. «Книга-Сервис» -- книготорговое агентство [Электронный ресурс]. - Режим доступа: http://www.akc.ru/ (дата обращения: 1.05.2016).

12. AngularJS [Электронный ресурс] // URL: https://ru.wikipedia.org/wiki/AngularJS (дата обращения: 20.02.2016).

13. В. Михайлов Подходы к проектированию RESTful [Электронный ресурс]. - Режим доступа: https://habrahabr.ru/company/dataart/blog/277419/ (дата обращения: 20.02.2016).

14. Basic access authentication [Электронный ресурс]. - Режим доступа: https://en.wikipedia.org/wiki/Basic_access_authentication (дата обращения: 20.02.2016).

15. Обзор способов и протоколов аутентификации в веб-приложениях [Электронный ресурс]. - Режим доступа: https://habrahabr.ru/company/dataart/blog/262817/ (дата обращения: 20.02.2016).

16. Аутентификация и авторизация [Электронный ресурс]. - Режим доступа: http://metanit.com/sharp/aspnet_webapi/5.1.php (дата обращения: 20.02.2016).

17. Аутентификация пользователей на основе технологии SSO [Электронный ресурс]. - Совит. - Режим доступа: http://www.sovit.net/articles/technologies/single_sign_on1/ (дата обращения: 19.03.2016).

18. SAML 2.0 Web Browser Single-Sign-On [Электронный ресурс]. - Режим доступа: https://www.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/cwlp_saml_web_sso.html (дата обращения: 19.03.2016).

19. Security Assertion Markup Language (SAML) V2.0 Technical Overview [Электронный ресурс]. - 2008. - Режим доступа: http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overview-2.0.html (дата обращения: 19.03.2016).

Приложение 1

Методы аутентификации по токену и выхода из системы.

# region Session

/// <summary>

/// Метод аутентификации пользователя на web-ресурсе по cookie

/// </summary>

/// <param name="model"></param>

/// <returns></returns>

[HttpPost]

[AllowAnonymous]

[Route("session")]

public async Task<IHttpActionResult> LoginByCookie(LoginUserBindingModel model)

{

UserManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

if (model == null)

{

return BadRequest("Invalid user data");

}

if (!ModelState.IsValid)

{

return BadRequest(ModelState);

}

ApplicationUser user = await _userManager.FindAsync(model.Username, model.Password);

if (user == null)

{

return BadRequest("Invalid username or password");

}

ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(_userManager,

CookieAuthenticationDefaults.AuthenticationType);

Authentication.SignIn(cookiesIdentity);

return this.ResponseMessage(new HttpResponseMessage());

}

// DELETE api/account/session

[HttpDelete]

[Route("session")]

public IHttpActionResult SessionLogOut()

{

this.Authentication.SignOut("Cookies");

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;

var resp = context.Response;

return this.Ok(

new

{

message = "Logout successful."

}

);

}

Приложение 2

Методы аутентификации по токену и выхода из системы

#region Token

// POST api/account/token

[HttpPost]

[AllowAnonymous]

[Route("token")]

public async Task<IHttpActionResult> LoginByToken(LoginUserBindingModel model)

{

if (model == null)

{

return BadRequest("Invalid user data");

}

if (!ModelState.IsValid)

{

return BadRequest(ModelState);

}

// Invoke the "token" OWIN service to perform the login: /token

var request = HttpContext.Current.Request;

var tokenServiceUrl = request.Url.GetLeftPart(UriPartial.Authority) + request.ApplicationPath + "/Token";

using (var client = new HttpClient())

{

var requestParams = new List<KeyValuePair<string, string>>

{

new KeyValuePair<string, string>("grant_type", "password"),

new KeyValuePair<string, string>("username", model.Username),

new KeyValuePair<string, string>("password", model.Password)

};

var requestParamsFormUrlEncoded = new FormUrlEncodedContent(requestParams);

var tokenServiceResponse = await client.PostAsync(tokenServiceUrl, requestParamsFormUrlEncoded);

if (tokenServiceResponse.StatusCode == HttpStatusCode.OK)

{

// Sucessful login --> create user session in the database

var responseString = await tokenServiceResponse.Content.ReadAsStringAsync();

var responseData =

JsonConvert.DeserializeObject<Dictionary<string, string>>(responseString);

var authToken = responseData["access_token"];

var username = responseData["userName"];

var userSessionManager = new UserSessionManager(Request.GetOwinContext().GetUserManager<ApplicationUserManager>());

userSessionManager.CreateUserSession(username, authToken);

// Cleanup: delete expired sessions from the database

userSessionManager.DeleteExpiredSessions();

}

return this.ResponseMessage(tokenServiceResponse);

}

}

// DELETE api/account/token

[HttpDelete]

[TokenSessionAuthorize]

[Route("token")]

public IHttpActionResult TokenLogOut()

{

this.Authentication.SignOut("Bearer");

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;

var resp = context.Response;

var userSessionManager = new UserSessionManager();

userSessionManager.InvalidateUserSession();

return this.Ok(

new

{

message = "Logout successful."

}

);

}

#endregion

Приложение 3

Фильтр авторизации по токену.

[AttributeUsageAttribute(AttributeTargets.Class | AttributeTargets.Method, Inherited = true,

AllowMultiple = true)]

public class TokenSessionAuthorizeAttribute : AuthorizeAttribute

{

public TokenSessionAuthorizeAttribute()

{

}

public override void OnAuthorization(HttpActionContext actionContext)

{

if (SkipAuthorization(actionContext))

{

return;

}

var userSessionManager = new UserSessionManager();

if (userSessionManager.ReValidateSession())

{

base.OnAuthorization(actionContext);

}

else

{

actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)

{

Content = new StringContent("Session token expried or not valid."),

StatusCode = HttpStatusCode.Unauthorized

};

}

}

private static bool SkipAuthorization(HttpActionContext actionContext)

{

return actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()

|| actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();

}

}

Приложение 4

Триггер для репликации зарегистрированных пользователей.

CREATE TRIGGER [dbo].tUI_UserName

ON [dbo].[AspNetUsers]

AFTER INSERT, UPDATE

AS

BEGIN

SET NOCOUNT ON;

--

-- Check if this is an INSERT, UPDATE or DELETE Action.

--

DECLARE @action as char(1);

SET @action = 'I'; -- Set Action to Insert by default.

IF EXISTS(SELECT * FROM DELETED)

BEGIN

SET @action =

CASE

WHEN EXISTS(SELECT * FROM INSERTED) THEN 'U' -- Set Action to Updated.

ELSE 'D' -- Set Action to Deleted.

END

END

ELSE

IF NOT EXISTS(SELECT * FROM INSERTED) RETURN; -- Nothing updated or inserted.

IF (@action='U')

Begin

UPDATE [Contextum].[dbo].[SPM_Subject]

/*subj.RegDate = DateTime.Now;

subj.EMail = tbEmail.Text;

subj.RegMagicString = Guid.NewGuid().ToString();

subj.PasswordHash = h;

subj.Title = tbSurname.Text + " " + tbFirstName.Text + " " + tbPatronymic.Text;

subj.IsActive = false;

subj.SID = "0";

subj.SystemName = tbLogin.Text;*/

SET [RegDate] = GETDATE()

,EMail = i.Email

,RegMagicString = NEWID()

,PasswordHash = i.rucont_PasswordHash

,IsActive = i.EmailConfirmed

,[SID] = '0'

,SystemName = i.UserName

FROM [Contextum].[dbo].[SPM_Subject] l

JOIN inserted i on i.rucont_SubjectID = l.[SubjectID]

end

else if (@action='I')

begin

INSERT INTO [Contextum].[dbo].[SPM_Subject]

([RegDate]

,[Email]

,[RegMagicString]

,[PasswordHash]

,[IsActive]

,[SID]

,[SystemName]

,[Title])

SELECT GETDATE()

,Email

,NEWID()

,rucont_PasswordHash

,EmailConfirmed

,'0'

,UserName

,UserName

FROM inserted i

WHERE not exists (select 1 from [Contextum].[dbo].[SPM_Subject] l where i.UserName = l.SystemName collate Cyrillic_General_CS_AS or i.Email=l.EMail collate SQL_Latin1_General_CP1_CS_AS )

INSERT INTO [Contextum].[dbo].[SPM_SubjectRole]

([RoleID]

,[SubjectID])

SELECT top(1) 22,s.SubjectID

FROM [Contextum].[dbo].[SPM_Subject] s, inserted i

WHERE s.EMail=i.Email collate SQL_Latin1_General_CP1_CS_AS and s.SystemName=i.UserName collate SQL_Latin1_General_CP1_CS_AS

end

END

Приложение 5

Настройка аутентификационного сервиса по протоколу SAML.

private static KentorAuthServicesAuthenticationOptions CreateAuthServicesOptions()

{

var spOptions = CreateSPOptions();

var authServicesOptions = new KentorAuthServicesAuthenticationOptions(false)

{

SPOptions = spOptions

};

var idp = new IdentityProvider(new EntityId("http://localhost:52071/Metadata"), spOptions)

{

AllowUnsolicitedAuthnResponse = true,

Binding = Saml2BindingType.HttpRedirect,

SingleSignOnServiceUrl = new Uri("http://localhost:52071")

};

idp.SigningKeys.AddConfiguredKey(

new X509Certificate2(

HostingEnvironment.MapPath(

"~/App_Data/Kentor.AuthServices.StubIdp.cer")));

authServicesOptions.IdentityProviders.Add(idp);

// It's enough to just create the federation and associate it

// with the options. The federation will load the metadata and

// update the options with any identity providers found.

new Federation("http://localhost:52071/Federation", true, authServicesOptions);

return authServicesOptions;

}

private static SPOptions CreateSPOptions()

{

var swedish = CultureInfo.GetCultureInfo("sv-se");

var organization = new Organization();

organization.Names.Add(new LocalizedName("Kentor", swedish));

organization.DisplayNames.Add(new LocalizedName("Kentor IT AB", swedish));

organization.Urls.Add(new LocalizedUri(new Uri("http://www.kentor.se"), swedish));

var spOptions = new SPOptions

{

EntityId = new EntityId("http://localhost:65432/AuthServices"),

ReturnUrl = new Uri("http://localhost:65432/SSO/ExternalLoginCallback"),

DiscoveryServiceUrl = new Uri("http://localhost:52071/DiscoveryService"),

Organization = organization

};

var techContact = new ContactPerson

{

Type = ContactType.Technical

};

techContact.EmailAddresses.Add("authservices@example.com");

spOptions.Contacts.Add(techContact);

var supportContact = new ContactPerson

{

Type = ContactType.Support

};

supportContact.EmailAddresses.Add("support@example.com");

spOptions.Contacts.Add(supportContact);

var attributeConsumingService = new AttributeConsumingService("AuthServices")

{

IsDefault = true,

};

attributeConsumingService.RequestedAttributes.Add(

new RequestedAttribute("urn:someName")

{

FriendlyName = "Some Name",

IsRequired = true,

NameFormat = RequestedAttribute.AttributeNameFormatUri

});

attributeConsumingService.RequestedAttributes.Add(

new RequestedAttribute("Minimal"));

spOptions.AttributeConsumingServices.Add(attributeConsumingService);

spOptions.ServiceCertificates.Add(new X509Certificate2(

AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "/App_Data/Kentor.AuthServices.Tests.pfx"));

return spOptions;

}

Приложение 6

Аутентификация с учетом агрегации данных из разных сервисов.

/// <summary>

/// Метод аутентификации пользователя на web-ресурсе по cookie.

/// Устанавливается cookie RucontAPI. Cokie является действительной на протяжении 12 часов

/// </summary>

/// <param name="model"><see cref="Models/LoginUserBindingModel"/></param>

/// <returns></returns>

[HttpPost]

[AllowAnonymous]

[Route("session")]

public async Task<IHttpActionResult> LoginByCookie(LoginUserBindingModel model)

{

var encoding = new UTF8Encoding();

UserManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();

if (model == null)

{

return BadRequest("Invalid user data");

}

if (!ModelState.IsValid)

{

return BadRequest(ModelState);

}

ApplicationUser user = await _userManager.FindByNameAsync(model.Username);

if (user == null)

{

return BadRequest("Invalid username");

}

bool authenticated = false;

if ((model.Username == user.rucont_UserName ||user.PasswordHash == null )&& user.rucont_PasswordHash != null)

{

byte[] h = SHA512.Create().ComputeHash(encoding.GetBytes(model.Password));

if (h.SequenceEqual(user.rucont_PasswordHash))

{

if (user.PasswordHash == null)

{

var result = UserManager.AddPassword(user.Id, model.Password);

}

authenticated = true;

}

}

else if ((model.Username == user.rucontext_UserName || user.PasswordHash == null) && user.rucontext_PasswordHash != null)

{

var hash = HashPassword(user.rucontext_PasswordHash);

if (hash == user.rucontext_PasswordHash)

{

authenticated = true;

if (user.PasswordHash == null)

UserManager.AddPassword(user.Id, model.Password);

}

}

else

{

user = await _userManager.FindAsync(model.Username, model.Password);

if (user != null) authenticated = true;

}

if (!authenticated)

{

return BadRequest("Invalid username or password");

}

ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(_userManager,

CookieAuthenticationDefaults.AuthenticationType);

Authentication.SignIn(cookiesIdentity);

return this.ResponseMessage(new HttpResponseMessage());

}

private string HashPassword(string password)

{

// Generate the hash, with an automatic 32 byte salt

Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, 32);

rfc2898DeriveBytes.IterationCount = 10000;

byte[] hash = rfc2898DeriveBytes.GetBytes(20);

//Return the salt and the hash

return Convert.ToBase64String(hash);

}

Приложение 7

Настройка сервиса аутентификации в mvc-приложении.

<authentication mode="Forms">

<forms loginUrl="~/AuthServices/SignIn" />

</authentication>

<system.webServer>

<modules>

<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />

</modules>

</system.webServer>

<kentor.authServices entityId="http://localhost:2181/AuthServices" returnUrl="http://localhost:2181/" discoveryServiceUrl="http://localhost:65432/DiscoverService/Index">

<identityProviders>

<add entityId="http://stubidp.kentor.se/Metadata" signOnUrl="http://stubidp.kentor.se/" allowUnsolicitedAuthnResponse="true" binding="HttpRedirect">

<signingCertificate fileName="~/App_Data/Kentor.AuthServices.StubIdp.cer" />

</add>

</identityProviders>

<federations>

<add metadataLocation="http://localhost:65432/Federation/" allowUnsolicitedAuthnResponse="true" />

</federations>

<serviceCertificates>

<add fileName="~/App_Data/Kentor.AuthServices.Tests.pfx" />

</serviceCertificates>

</kentor.authServices>

<system.identityModel.services>

<federationConfiguration>

<cookieHandler requireSsl="false" name="SampleMvcApplicationAuth" />

</federationConfiguration>

</system.identityModel.services>

Приложение 8

Контроллер и модель метаданных, FederationController

[Route("Metadata")]

public class MetadataController : Controller

{

// GET: Metadata

[Route("/")]

public ActionResult Index()

{

return Content(

MetadataModel.CreateIdpMetadata()

.ToXmlString(CertificateHelper.SigningCertificate),

"application/samlmetadata+xml");

}

public ActionResult BrowserFriendly()

{

return Content(

MetadataModel.CreateIdpMetadata()

.ToXmlString(CertificateHelper.SigningCertificate),

"text/xml");

}

}

public static class MetadataModel

{

public static ExtendedEntityDescriptor CreateIdpMetadata(bool includeCacheDuration = true)

{

var metadata = new ExtendedEntityDescriptor()

{

EntityId = new EntityId(UrlResolver.MetadataUrl.ToString())

};

if (includeCacheDuration)

{

metadata.CacheDuration = new TimeSpan(0, 15, 0);

metadata.ValidUntil = DateTime.UtcNow.AddDays(1);

}

var idpSsoDescriptor = new IdentityProviderSingleSignOnDescriptor();

idpSsoDescriptor.ProtocolsSupported.Add(new Uri("urn:oasis:names:tc:SAML:2.0:protocol"));

metadata.RoleDescriptors.Add(idpSsoDescriptor);

idpSsoDescriptor.SingleSignOnServices.Add(new ProtocolEndpoint()

{

Binding = Saml2Binding.HttpRedirectUri,

Location = UrlResolver.SsoServiceUrl

});

idpSsoDescriptor.ArtifactResolutionServices.Add(0, new IndexedProtocolEndpoint()

{

Index = 0,

IsDefault = true,

Binding = Saml2Binding.SoapUri,

Location = UrlResolver.ArtifactServiceUrl

});

idpSsoDescriptor.SingleLogoutServices.Add(new ProtocolEndpoint()

{

Binding = Saml2Binding.HttpRedirectUri,

Location = UrlResolver.LogoutServiceUrl

});

idpSsoDescriptor.SingleLogoutServices.Add(new ProtocolEndpoint()

{

Binding = Saml2Binding.HttpPostUri,

Location = UrlResolver.LogoutServiceUrl

});

idpSsoDescriptor.Keys.Add(CertificateHelper.SigningKey);

return metadata;

}

public static ExtendedEntitiesDescriptor CreateFederationMetadata()

{

var metadata = new ExtendedEntitiesDescriptor

{

Name = "Kentor.AuthServices.StubIdp Federation",

CacheDuration = new TimeSpan(0, 15, 0),

ValidUntil = DateTime.UtcNow.AddDays(1)

};

metadata.ChildEntities.Add(CreateIdpMetadata(false));

return metadata;

}

}

Route("Federation")]

public class FederationController : Controller

{

// GET: Federation

[Route("/")]

public ActionResult Index()

{

return Content(

MetadataModel.CreateFederationMetadata()

.ToXmlString(CertificateHelper.SigningCertificate),

"application/samlmetadata+xml");

}

public ActionResult BrowserFriendly()

{

return Content(

MetadataModel.CreateFederationMetadata()

.ToXmlString(CertificateHelper.SigningCertificate),

"text/xml");

}

}

}

Приложение 9

Контроллер IdP

[Route("IdP")]

public class IdPController :BaseController

{

[Route("/")]

public ActionResult Index(Guid? idpId)

{

var model = new HomePageModel

{

AssertionModel = AssertionModel.CreateFromConfiguration(),

};

if (idpId.HasValue)

{

var fileData = GetCachedConfiguration(idpId.Value);

if (fileData != null)

{

if (!string.IsNullOrEmpty(fileData.DefaultAssertionConsumerServiceUrl))

{

// Override default StubIdp Acs with Acs from IdpConfiguration

model.AssertionModel.AssertionConsumerServiceUrl = fileData.DefaultAssertionConsumerServiceUrl;

}

if (!string.IsNullOrEmpty(fileData.DefaultAssertionConsumerServiceUrl))

{

model.AssertionModel.Audience = fileData.DefaultAudience;

}

model.CustomDescription = fileData.IdpDescription;

model.AssertionModel.NameId = null;

model.HideDetails = fileData.HideDetails;

}

}

var requestData = Request.ToHttpRequestData(true);

if (requestData.QueryString["SAMLRequest"].Any())

{

var extractedMessage = Saml2Binding.Get(Saml2BindingType.HttpRedirect)

.Unbind(requestData, null);

var request = new Saml2AuthenticationRequest(

extractedMessage.Data,

extractedMessage.RelayState);

model.AssertionModel.InResponseTo = request.Id.Value;

model.AssertionModel.AssertionConsumerServiceUrl = request.AssertionConsumerServiceUrl.ToString();

model.AssertionModel.RelayState = extractedMessage.RelayState;

model.AssertionModel.Audience = request.Issuer.Id;

model.AssertionModel.AuthnRequestXml = extractedMessage.Data.PrettyPrint();

}

return View(model);

}

[HttpPost]

public ActionResult Index(Guid? idpId, HomePageModel model)

{

if (ModelState.IsValid)

{

var response = model.AssertionModel.ToSaml2Response();

var binding = Saml2Binding.Get(model.AssertionModel.ResponseBinding)

.Bind(response);

var res = binding.ToActionResult();

return res;

}

return View(model);

}

}

Размещено на Allbest.ru

...

Подобные документы

  • Трансляция полей формы. Метод аутентификации в Web как требование к посетителям предоставить имя пользователя и пароль. Форма для передачи данных. Использование базу данных для хранения паролей. Разработка сценарий для аутентификации посетителей.

    лекция [225,0 K], добавлен 27.04.2009

  • Понятие процесса биометрической аутентификации. Технология и вероятность ошибок аутентификации по отпечатку пальца, радужной оболочке или по сетчатке глаза, по геометрии руки и лица человека, по термограмме лица, по голосу, по рукописному почерку.

    презентация [1,2 M], добавлен 03.05.2014

  • Разработка средствами языка PHP и Фреймворка Yii системы регистрации и аутентификации пользователей на сайте. Проектирование приложения с помощью языка UML, построение диаграммы прецедентов. База данных приложения. Страница регистрации пользователей.

    отчет по практике [1,1 M], добавлен 15.09.2014

  • Обеспечение безопасности сетевого соединения. Процесс аутентификации при установке соединения и процесс передачи данных. Использование криптостойкого шифрования. Протокол аутентификации Kerberos. Основные этапы процедуры аутентификации клиента.

    презентация [162,8 K], добавлен 10.09.2013

  • Использование электронных ключей как средства аутентификации пользователей. Анализ методов идентификации и аутентификации с точки зрения применяемых в них технологий. Установка и настройка средств аутентификации "Rutoken", управление драйверами.

    курсовая работа [4,6 M], добавлен 11.01.2013

  • Разработка предложений по внедрению биометрической аутентификации пользователей линейной вычислительной сети. Сущность и характеристика статических и динамических методов аутентификации пользователей. Методы устранения угроз, параметры службы защиты.

    курсовая работа [347,3 K], добавлен 25.04.2014

  • Разработка подключаемых модулей аутентификации как средства аутентификации пользователей. Модуль Linux-PAM в составе дистрибутивов Linux. Принцип работы, администрирование, ограничение по времени и ресурсам. Обзор подключаемых модулей аутентификации.

    курсовая работа [192,0 K], добавлен 29.01.2011

  • Создание базы данных для хранения информации о пользователях системы. Применение механизма аутентификации и управления сессиями. Описание программных мер, предпринятых для обеспечения безопасности информационных ресурсов образовательного веб-портала.

    дипломная работа [2,2 M], добавлен 27.06.2012

  • Нормативно-правовые документы в сфере информационной безопасности в России. Анализ угроз информационных систем. Характеристика организации системы защиты персональных данных клиники. Внедрение системы аутентификации с использованием электронных ключей.

    дипломная работа [2,5 M], добавлен 31.10.2016

  • Создание системы предобработки данных; разработка системы классификации на базе методов и алгоритмов машинного обучения, их реализация в программной системе. Предобработка информации, инструкция пользователя, система классификации, машинный эксперимент.

    дипломная работа [917,1 K], добавлен 31.01.2015

  • Основные угрозы по отношению к информации. Понятия, методы и способы обеспечения защиты данных. Требования к системе защиты. Механизм авторизации в информационной базе для определения типа пользователя. Работа администратора с системой безопасности.

    курсовая работа [201,1 K], добавлен 24.06.2013

  • Общая характеристика киноиндустрии как предметной области работы. Разработка базы данных и дерева вопросов для получения информации для выбора фильма. Программная реализация экспертной системы. Тестирование системы и создание руководства пользователя.

    курсовая работа [1,9 M], добавлен 19.05.2014

  • Понятие безопасности данных. Базовые технологии сетевой аутентификации информации на основе многоразового и одноразового паролей: авторизация доступа, аудит. Сертифицирующие центры, инфраструктура с открытыми ключами, цифровая подпись, программные коды.

    курсовая работа [861,3 K], добавлен 23.12.2014

  • Информационные задачи и круг пользователей системы. Выработка требований и ограничений. Разработка проекта базы данных. Программная реализация проекта базы данных. Разработка хранимых процедур для поддержки сложных ограничений целостности в базе данных.

    курсовая работа [706,2 K], добавлен 17.06.2012

  • Разработка web-приложения для оперирования данными с помощью базы данных и web-браузера в качестве клиента пользователя. Основные преимущества языка программирования Java. Осуществление редактирования, добавления информации и поиска по архивам данных.

    дипломная работа [2,1 M], добавлен 30.09.2016

  • Анализ предметной области. Разработка информационной системы для регистратуры поликлиники. Построение диаграмм и моделей с использование объектно-ориентированного подхода. Формы, таблицы, отчеты и запросы. Создание, редактирование и обработка данных.

    курсовая работа [2,7 M], добавлен 04.12.2015

  • Системный анализ предметной области. Нормальные формы таблиц. Физическое проектирование базы данных. Реализация структуры БД в СУБД MySQL. Запросы на создание таблиц, добавление и выборку данных. Реализация триггера и функции. Программный код WEB-страниц.

    курсовая работа [748,9 K], добавлен 01.11.2014

  • Проектирование базы данных для автоматизированной системы "Склад". Разработка концептуальной модели (ER-диаграмма). Преобразование в реляционную модель и ее нормализация. Разработка запросов к базе данных на языке SQL. Скрипт для создания базы данных.

    курсовая работа [161,8 K], добавлен 07.10.2013

  • Определения криптографии как практической дисциплины, изучающей и разрабатывающей способы шифрования сообщений. История развития шифров. Хэш-функции и понятие электронной подписи. Системы идентификации, аутентификации и сертификации открытых ключей.

    реферат [77,1 K], добавлен 10.12.2011

  • Понятие офтальмологии, виды и методы ее диагностики. Глазные заболевания и их симптомы. Применимость экспертных систем. Проектирование модели байесовской сети. Разработка инфологической модели базы данных. Руководство пользователя и тестирование системы.

    дипломная работа [1,4 M], добавлен 13.11.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.