Построение централизованной системы идентификации и аутентификации на базе IdentityServer

Содержание

Слайд 2

www.synerdocs.ru Построение централизованной системы идентификации и аутентификации на базе IdentityServer

www.synerdocs.ru

Построение централизованной системы идентификации и аутентификации на базе IdentityServer

Слайд 3

www.synerdocs.ru О продукте

www.synerdocs.ru

О продукте

Слайд 4

www.synerdocs.ru

www.synerdocs.ru

Слайд 5

www.synerdocs.ru

www.synerdocs.ru

Слайд 6

www.synerdocs.ru API IdSvr Users Svc Svc Web Web SSO Доверие Взаимодействие Компонент Synerdocs Компонент партнера Архитектура

www.synerdocs.ru

API

IdSvr

Users

Svc

Svc

Web

Web

SSO

Доверие

Взаимодействие

Компонент
Synerdocs

Компонент
партнера

Архитектура

Слайд 7

www.synerdocs.ru Терминология

www.synerdocs.ru

Терминология

Слайд 8

(I) Идентификация - Кто ты? (A) Аутентификация - Действительно ли ты

(I) Идентификация
- Кто ты?
(A) Аутентификация
- Действительно ли ты являешься тем, за

кого себя выдаешь?
(A) Авторизация
- Имеешь ли ты право выполнять данное действие?
(D) Делегирование доступа
- Предоставляешь ли ты этому субъекту свои права доступа?

www.synerdocs.ru

Слайд 9

www.synerdocs.ru Предпосылки внедрения

www.synerdocs.ru

Предпосылки внедрения

Слайд 10

www.synerdocs.ru API Users Взаимодействие Компонент Synerdocs Единственное приложение API (-) Собственный

www.synerdocs.ru

API

Users

Взаимодействие

Компонент
Synerdocs

Единственное приложение API

(-) Собственный механизм выдачи и формат токенов для

клиентов API
Слайд 11

www.synerdocs.ru API Users Web Взаимодействие Компонент Synerdocs Добавление собственного веб клиента Forms Authentication (-) Общее хранилище

www.synerdocs.ru

API

Users

Web

Взаимодействие

Компонент
Synerdocs

Добавление собственного веб клиента

Forms
Authentication

(-) Общее хранилище

Слайд 12

www.synerdocs.ru API Users Web Web Взаимодействие Компонент Synerdocs Компонент партнера Добавление

www.synerdocs.ru

API

Users

Web

Web

Взаимодействие

Компонент
Synerdocs

Компонент
партнера

Добавление веб клиента партнера

(?) Как добавить SSO

Слайд 13

www.synerdocs.ru API IdSvr Users Web Web SSO Доверие Взаимодействие Компонент Synerdocs

www.synerdocs.ru

API

IdSvr

Users

Web

Web

SSO

Доверие

Взаимодействие

Компонент
Synerdocs

Компонент
партнера

Добавление IdentityServer

OIDC
Implicit

OIDC
Authorization
Code

Взаимодействие с хранилищем в плане I/A логики вынесено в

IdentityServer
Слайд 14

www.synerdocs.ru API IdSvr Users Svc Svc Web Web SSO Доверие Взаимодействие

www.synerdocs.ru

API

IdSvr

Users

Svc

Svc

Web

Web

SSO

Доверие

Взаимодействие

Компонент
Synerdocs

Компонент
партнера

Добавление внутренних служб

OAuth 2.0
Client Credentials

Слайд 15

www.synerdocs.ru API Users Svc Svc Web Web SSO Доверие Взаимодействие Компонент

www.synerdocs.ru

API

Users

Svc

Svc

Web

Web

SSO

Доверие

Взаимодействие

Компонент
Synerdocs

Компонент
партнера

Добавление внешних поставщиков

Центральный хаб

IdSvr

Слайд 16

www.synerdocs.ru IdentityServer

www.synerdocs.ru

IdentityServer

Слайд 17

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

развертываемый компонент (ASP.NET Core Middleware), реализующая следующие возможности:

www.synerdocs.ru

Общая информация

Слайд 18

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

развертываемый компонент (ASP.NET Core Middleware), реализующая следующие возможности:
Аутентификация на основе токенов

www.synerdocs.ru

Общая информация

Слайд 19

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

развертываемый компонент (ASP.NET Core Middleware), реализующая следующие возможности:
Аутентификация на основе токенов
Технология единого входа (Single Sign-On - SSO)

www.synerdocs.ru

Общая информация

Слайд 20

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

развертываемый компонент (ASP.NET Core Middleware), реализующая следующие возможности:
Аутентификация на основе токенов
Технология единого входа (Single Sign-On - SSO)
Контроль доступа к API

www.synerdocs.ru

Общая информация

Слайд 21

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

IdentityServer – это .NET Standard библиотека с открытым исходным кодом и

развертываемый компонент (ASP.NET Core Middleware), реализующая следующие возможности:
Аутентификация на основе токенов
Технология единого входа (Single Sign-On - SSO)
Контроль доступа к API
Стандарты OAuth 2.0 и OpenID Connect 1.0

www.synerdocs.ru

Общая информация

Слайд 22

2012: IdentityServer1 2013: IdentityServer2 2015: IdentityServer3 2016: IdentityServer4 OAuth 2.0 /

2012: IdentityServer1
2013: IdentityServer2
2015: IdentityServer3
2016: IdentityServer4
OAuth 2.0 / OpenID Connect 1.0
.NET Core

2.0 / ASP.NET Core 2.0

www.synerdocs.ru

История проекта

Слайд 23

Исходный код GitHub / IdentityServer NuGet пакет NuGet / IdentityServer Лицензия Apache 2.0 www.synerdocs.ru Как получить

Исходный код
GitHub / IdentityServer
NuGet пакет
NuGet / IdentityServer
Лицензия
Apache 2.0

www.synerdocs.ru

Как получить

Слайд 24

IdentityServer реализует только серверную часть стандартов. Для взаимодействия со стороны клиента

IdentityServer реализует только серверную часть стандартов. Для взаимодействия со стороны клиента

нужно воспользоваться следующими библиотеками:
Классические ASP.NET / MVC / Web API приложения:
NuGet / OWIN / OAuth 2.0
NuGet / OWIN / OpenID Connect 1.0
ASP.NET Core приложения:
NuGet / ASP.NET Core / OAuth 2.0
NuGet / ASP.NET Core / OpenID Connect 1.0

www.synerdocs.ru

Клиентские библиотеки

Слайд 25

www.synerdocs.ru Реализованные спецификации

www.synerdocs.ru

Реализованные спецификации

Слайд 26

OpenID Connect 1.0 OpenID Connect Core 1.0 (spec) OpenID Connect Discovery

OpenID Connect 1.0
OpenID Connect Core 1.0 (spec)
OpenID Connect Discovery 1.0 (spec)
OpenID

Connect Session Management 1.0 - draft 28 (spec)
OpenID Connect Front-Channel Logout 1.0 - draft 02 (spec)
OpenID Connect Back-Channel Logout 1.0 - draft 04 (spec)
OAuth 2.0
OAuth 2.0 (RFC 6749)
OAuth 2.0 Bearer Token Usage (RFC 6750)
OAuth 2.0 Multiple Response Types (spec)
OAuth 2.0 Form Post Response Mode (spec)
OAuth 2.0 Token Revocation (RFC 7009)
OAuth 2.0 Token Introspection (RFC 7662)
Proof Key for Code Exchange (RFC 7636)
JSON Web Tokens for Client Authentication (RFC 7523)
OAuth 2.0 Device Flow for Browserless and Input Constrained Devices (draft)

www.synerdocs.ru

Слайд 27

www.synerdocs.ru Суммарно это около 300 страниц текста Можно ли быстро и корректно реализовать их самостоятельно?

www.synerdocs.ru

Суммарно это около 300 страниц текста
Можно ли быстро и корректно реализовать

их самостоятельно?
Слайд 28

www.synerdocs.ru Токены

www.synerdocs.ru

Токены

Слайд 29

Access Token, Identity Token, Reference Token, Bearer Token, JWT … Как

Access Token, Identity Token, Reference Token, Bearer Token, JWT …
Как разработчику,

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

www.synerdocs.ru

Слайд 30

Классификация по назначению www.synerdocs.ru

Классификация по назначению

www.synerdocs.ru

Слайд 31

Классификация по назначению www.synerdocs.ru

Классификация по назначению

www.synerdocs.ru

Слайд 32

Классификация по способу передачи www.synerdocs.ru

Классификация по способу передачи

www.synerdocs.ru

Слайд 33

Классификация по способу передачи www.synerdocs.ru

Классификация по способу передачи

www.synerdocs.ru

Слайд 34

Классификация по способу использования www.synerdocs.ru

Классификация по способу использования

www.synerdocs.ru

Слайд 35

Классификация по способу использования www.synerdocs.ru

Классификация по способу использования

www.synerdocs.ru

Слайд 36

Классификация по формату www.synerdocs.ru

Классификация по формату

www.synerdocs.ru

Слайд 37

Классификация по формату www.synerdocs.ru HEADER PAYLOAD SIGNATURE LOCATION VERSION HEADER PAYLOAD SIGNATURE FOOTER

Классификация по формату

www.synerdocs.ru

HEADER
PAYLOAD
SIGNATURE

LOCATION
VERSION
HEADER
PAYLOAD
SIGNATURE
FOOTER

Слайд 38

www.synerdocs.ru Внедрение IdentityServer

www.synerdocs.ru

Внедрение IdentityServer

Слайд 39

www.synerdocs.ru Серверное приложение

www.synerdocs.ru

Серверное приложение

Слайд 40

public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddIdentityServer();

public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

services.AddIdentityServer();
}
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseIdentityServer();
app.UseMvcWithDefaultRoute();
}
}

www.synerdocs.ru

Создание и настройка приложения с IdentityServer

Слайд 41

public class Startup { public IHostingEnvironment Environment { get; } public

public class Startup
{
public IHostingEnvironment Environment { get; }

public void ConfigureServices(IServiceCollection services)
{
// ...
var builder = services.AddIdentityServer();
if (Environment.IsDevelopment())
builder.AddDeveloperSigningCredential();
else
builder.AddSigningCredential(GetSigningCertificate());
}
private X509Certificate2 GetSigningCertificate()
{
// ...
}
}

www.synerdocs.ru

Создание и подключение X509 сертификата

Слайд 42

www.synerdocs.ru Объявление клиентских приложений yield return new Client { ClientId =

www.synerdocs.ru

Объявление клиентских приложений

yield return new Client {
ClientId = "web_client_id",

AllowedGrantTypes = GrantTypes.Implicit,
AllowedScopes = { "openid" },
RedirectUris = { "https://web-client.synerdocs.ru/app/auth" },
RequireConsent = false };
yield return new Client {
ClientId = "api_client_id",
AllowedGrantTypes = GrantTypes.Code,
ClientSecrets = { new Secret("api_client_secret".Sha256()) },
AllowedScopes = { "offline_access", "api_method" },
RedirectUris = { "https://api-client.synerdocs.ru/app/auth" },
AccessTokenType = AccessTokenType.Reference };
yield return new Client {
ClientId = "svc_client_id",
AllowedGrantTypes = GrantTypes.ClientCredentials,
ClientSecrets = { new Secret("svc_client_secret".Sha256()) },
AllowedScopes = { "svc_method" },
AccessTokenType = AccessTokenType.Jwt };
Слайд 43

www.synerdocs.ru UI

www.synerdocs.ru

UI

Слайд 44

www.synerdocs.ru Разработка всего UI полностью под ответственностью разработчика На GitHub доступен

www.synerdocs.ru

Разработка всего UI полностью под ответственностью разработчика
На GitHub доступен пример построения

UI на базе
ASP.NET Core MVC, Bootstrap и jQuery
https://github.com/IdentityServer/IdentityServer4.Quickstart.UI
Слайд 45

www.synerdocs.ru UI в примере

www.synerdocs.ru

UI в примере

Слайд 46

www.synerdocs.ru UI в Synerdocs

www.synerdocs.ru

UI в Synerdocs

Слайд 47

www.synerdocs.ru Хранилище пользователей

www.synerdocs.ru

Хранилище пользователей

Слайд 48

www.synerdocs.ru Подключение хранилища пользователей Для ASP.NET Membership / ASP.NET Identity готовые

www.synerdocs.ru

Подключение хранилища пользователей

Для ASP.NET Membership / ASP.NET Identity готовые решения:
https://www.nuget.org/packages/IdentityServer4.Contrib.Membership/
https://github.com/IdentityServer/IdentityServer4.AspNetIdentity
В других

случая потребуется самостоятельно реализовать две точки расширения:
IResourceOwnerPasswordValidator
IProfileService
Слайд 49

www.synerdocs.ru IResourceOwnerPasswordValidator public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { public IUserService UserService

www.synerdocs.ru

IResourceOwnerPasswordValidator

public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
public IUserService UserService {

get; set; } // DI.
public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
var user = UserService.ValidateUser(context.UserName, context.Password);
if (user == null)
context.Result = new GrantValidationResult(
TokenRequestErrors.InvalidGrant,
"Incorrect username or password");
else
context.Result = new GrantValidationResult(user.UserId.ToString(), "custom",
new[]
{
new Claim(JwtClaimTypes.Name, user.Name),
new Claim(JwtClaimTypes.Email, user.Email),
});
return Task.CompletedTask;
}
}
Слайд 50

www.synerdocs.ru IProfileService public class ProfileService : IProfileService { public IUserService UserService

www.synerdocs.ru

IProfileService

public class ProfileService : IProfileService
{
public IUserService UserService {

get; set; } // DI.
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var userId = context.Subject.Claims
.FirstOrDefault(x => x.Type == JwtClaimTypes.Subject);
if (string.IsNullOrEmpty(userId?.Value))
return Task.CompletedTask;
var user = UserService.GetUser(int.Parse(userId.Value));
context.IssuedClaims = new[]
{
new Claim(JwtClaimTypes.FirstName, user.FirstName),
new Claim(JwtClaimTypes.LastName, user.LastName),
new Claim(JwtClaimTypes.MiddleName, user.MiddleName),
}
.Where(x => context.RequestedClaimTypes.Contains(x.Type))
.ToList();
return Task.CompletedTask;
}
}
Слайд 51

www.synerdocs.ru Клиентские приложения

www.synerdocs.ru

Клиентские приложения

Слайд 52

www.synerdocs.ru Web клиент Synerdocs OIDC 1.0 – OWIN Security Middleware

www.synerdocs.ru

Web клиент Synerdocs
OIDC 1.0 – OWIN Security Middleware

Слайд 53

public class Startup { public void Configuration(IAppBuilder app) { // ...

public class Startup
{
public void Configuration(IAppBuilder app)
{
//

...
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
ExpireTimeSpan = TimeSpan.FromHours(8),
SlidingExpiration = false,
});
// ...
}
}

www.synerdocs.ru

Подключение Cookie Authentication

Слайд 54

public class Startup { public void Configuration(IAppBuilder app) { // ...

public class Startup
{
public void Configuration(IAppBuilder app)
{
//

...
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://identity.synerdocs.ru",
RedirectUri = "https://web-client.synerdocs.ru/app/auth",
ClientId = "web_client_id",
ResponseType = "id_token",
SignInAsAuthenticationType = "Cookies",
Scope = "openid",
UseTokenLifetime = false,
});
// ...
}
}

www.synerdocs.ru

Подключение OpenID Connect Authentication

Слайд 55

www.synerdocs.ru Отключение аутентификации на основе форм mode="Forms"> timeout="2880" loginUrl="~/Account/LogOn" />

www.synerdocs.ru

Отключение аутентификации на основе форм

mode="Forms">
timeout="2880"
loginUrl="~/Account/LogOn" />


Слайд 56

www.synerdocs.ru Web клиент партнера OAuth 2.0 - Authorization Code Grant

www.synerdocs.ru

Web клиент партнера
OAuth 2.0 - Authorization Code Grant

Слайд 57

private ActionResult RedirectToAuthority() { return Redirect("https://identity.synerdocs.ru" + "/connect/authorize" + "?response_type=code" +

private ActionResult RedirectToAuthority()
{
return Redirect("https://identity.synerdocs.ru"
+ "/connect/authorize"
+ "?response_type=code"

+ "&client_id=api_client_id"
+ "&redirect_uri=https://api-client.synerdocs.ru/app/auth"
+ "&state=data"
+ "&scope=offline_access api_method");
}
public async Task Auth(string code, string state, string error)
{
await TakeAccessToken(code);
return RedirectToAction("Index");
}

www.synerdocs.ru

Перенаправление и обратный вызов

Слайд 58

private async Task TakeAccessToken(string authorizationCode) { using (var httpClient = new

private async Task TakeAccessToken(string authorizationCode)
{
using (var httpClient =

new HttpClient())
{
httpClient.BaseAddress = new Uri("https://identity.synerdocs.ru");
var httpResponse = await httpClient.PostAsync("connect/token",
new FormUrlEncodedContent(new[]
{
new KeyValuePair("code", authorizationCode),
new KeyValuePair("grant_type", "authorization_code"),
new KeyValuePair("client_id", "api_client_id"),
new KeyValuePair("client_secret", "api_client_secret"),
new KeyValuePair("redirect_uri",
"https://api-client.synerdocs.ru/app/auth"),
}));
_tokenResponse = JsonConvert.DeserializeObject(
await httpResponse.Content.ReadAsStringAsync());
}
}

www.synerdocs.ru

Получение токена доступа

Слайд 59

private async Task CallApiMethod() { using (var httpClient = new HttpClient())

private async Task CallApiMethod()
{
using (var httpClient = new

HttpClient())
{
httpClient.BaseAddress = new Uri("https://api.synerdocs.ru");
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer",
_tokenResponse.AccessToken);
var httpResponse = await httpClient.PostAsync("api/method",
new FormUrlEncodedContent(new[]
{
new KeyValuePair("param1", "val1"),
new KeyValuePair("param2", "val2"),
}));
_methodResult = await httpResponse.Content.ReadAsStringAsync();
}
}

www.synerdocs.ru

Вызов метода API

Слайд 60

private async Task RefreshAccessToken() { using (var httpClient = new HttpClient())

private async Task RefreshAccessToken()
{
using (var httpClient = new

HttpClient())
{
httpClient.BaseAddress = new Uri("https://identity.synerdocs.ru");
var httpResponse = await httpClient.PostAsync("connect/token",
new FormUrlEncodedContent(new[]
{
new KeyValuePair("grant_type", "refresh_token"),
new KeyValuePair("client_id", "api_client_id"),
new KeyValuePair("client_secret",
"api_client_secret"),
new KeyValuePair("refresh_token",
_tokenResponse.RefreshToken),
}));
_tokenResponse = JsonConvert.DeserializeObject(
await httpResponse.Content.ReadAsStringAsync());
}
}

www.synerdocs.ru

Обновление токена доступа

Слайд 61

www.synerdocs.ru Внутренние службы OAuth 2.0 – Client Credentials Grant

www.synerdocs.ru

Внутренние службы
OAuth 2.0 – Client Credentials Grant

Слайд 62

private async Task TakeAccessToken() { using (var httpClient = new HttpClient())

private async Task TakeAccessToken()
{
using (var httpClient = new

HttpClient())
{
httpClient.BaseAddress = new Uri("https://identity.synerdocs.ru");
var httpResponse = await httpClient.PostAsync("connect/token",
new FormUrlEncodedContent(new[]
{
new KeyValuePair("grant_type",
"client_credentials"),
new KeyValuePair("client_id", "svc_client_id"),
new KeyValuePair("client_secret",
"svc_client_secret"),
new KeyValuePair("scope", "svc_method"),
}));
_tokenResponse = JsonConvert.DeserializeObject(
await httpResponse.Content.ReadAsStringAsync());
}
}

www.synerdocs.ru

Получение токена доступа

Слайд 63

private async Task CallServiceMethod() { using (var httpClient = new HttpClient())

private async Task CallServiceMethod()
{
using (var httpClient = new

HttpClient())
{
httpClient.BaseAddress = new Uri("https://svc.synerdocs.ru");
httpClient.DefaultRequestHeaders.Authorization
= new AuthenticationHeaderValue("Bearer",
_tokenResponse.AccessToken);
var httpResponse = await httpClient.PostAsync("svc/method",
new FormUrlEncodedContent(new[]
{
new KeyValuePair("param1", "val1"),
new KeyValuePair("param2", "val2"),
}));
_methodResult = await httpResponse.Content.ReadAsStringAsync();
}
}

www.synerdocs.ru

Вызов метода службы

Слайд 64

www.synerdocs.ru Трудоемкость

www.synerdocs.ru

Трудоемкость

Слайд 65

Серверное приложение 1 человеко-неделя Разработка UI 2 человеко-недели Клиентские приложения 1

Серверное приложение
1 человеко-неделя
Разработка UI
2 человеко-недели
Клиентские приложения
1 человеко-неделя
Подводные камни и особенности
2 человеко-недели

www.synerdocs.ru

Слайд 66

www.synerdocs.ru Подводные камни и особенности

www.synerdocs.ru

Подводные камни и особенности

Слайд 67

www.synerdocs.ru Трансформация claim’ов JwtSecurityTokenHandler.InboundClaimTypeMap.Clear(); oidcOptions.Notifications = new OpenIdConnectAuthenticationNotifications { SecurityTokenValidated =

www.synerdocs.ru

Трансформация claim’ов

JwtSecurityTokenHandler.InboundClaimTypeMap.Clear();
oidcOptions.Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = ctx

=>
{
// Для корректной работы AuthorizationAttribute и ClaimsIdentity.Name.
var oldIdentity = ctx.AuthenticationTicket.Identity;
var newIdentity = new ClaimsIdentity(
oldIdentity.FindAll(_ => NecessaryClaimNames.Contains(_.Type)),
oldIdentity.AuthenticationType,
nameType: "login",
roleType: "role");
ctx.AuthenticationTicket = new AuthenticationTicket(newIdentity,
ctx.AuthenticationTicket.AuthenticationProperties);
return Task.FromResult(0);
},
};
Слайд 68

www.synerdocs.ru Перенаправление после выхода oidcOptions.Notifications = new OpenIdConnectAuthenticationNotifications { SecurityTokenValidated =

www.synerdocs.ru

Перенаправление после выхода

oidcOptions.Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = ctx

=>
{
var oldIdentity = ctx.AuthenticationTicket.Identity;
var newIdentity = new ClaimsIdentity(oldIdentity.Claims,
oldIdentity.AuthenticationType);
newIdentity.AddClaim(new Claim("id_token", ctx.ProtocolMessage.IdToken));
ctx.AuthenticationTicket = new AuthenticationTicket(newIdentity,
ctx.AuthenticationTicket.AuthenticationProperties);
return Task.FromResult(0);
},
RedirectToIdentityProvider = ctx =>
{
// Для корректной работы перенаправления после выхода.
ctx.ProtocolMessage.IdTokenHint
= ctx.OwinContext.Authentication.User.FindFirst("id_token").Value;
return Task.FromResult(0);
},
};
Слайд 69

www.synerdocs.ru Обработка nonce cookie protected override void RememberNonce(OpenIdConnectMessage message, string nonce)

www.synerdocs.ru

Обработка nonce cookie

protected override void RememberNonce(OpenIdConnectMessage message, string nonce)
{

var cookieOptions = new CookieOptions { HttpOnly = true, Secure = Request.IsSecure };
if (!Options.NonceCookiePath.IsNullOrWhiteSpace())
// Задаем отдельный путь для каждого сайта, если они развернуты на одном домене.
cookieOptions.Path = Options.NonceCookiePath;
if (Options.NonceThreshold > 0)
{
// Ограничиваем максимальное количество nonce cookie для одного клиента.
var noncePrefix = GetNonceCookiePrefix();
var oldNonces = Request.Cookies
.Where(_ => _.Key.StartsWith(noncePrefix))
.ToList();
if (oldNonces.Count >= Options.NonceThreshold)
for (var i = 0; i <= oldNonces.Count - Options.NonceThreshold; i++)
Response.Cookies.Delete(oldNonces[i].Key, cookieOptions);
}
base.RememberNonce(message, nonce);
}
Слайд 70

Отсутствие встроенной поддержки более старых протоколов WS-Trust, WS-Federation, SAML 1.1/2.0, OAuth

Отсутствие встроенной поддержки более старых протоколов WS-Trust, WS-Federation, SAML 1.1/2.0, OAuth

1.0, OpenID 1.0/2.0 и других
Отдельный продукт IdentityServer4 SAML 2.0
Отдельный продукт IdentityServer4 WS-Federation
Отсутствие встроенной панели управления
Отдельный продукт AdminUI

www.synerdocs.ru

Другие ограничения

Слайд 71

Отсутствие поддержки IdP Initiated SSO в OpenID Connect 1.0 Ведутся работы

Отсутствие поддержки IdP Initiated SSO в OpenID Connect 1.0
Ведутся работы по

стандартизации в черновике https://tools.ietf.org/html/draft-bradley-oauth-jwt-encoded-state-09#section-4.3
Katana Project на текущий момент почти не развивается и есть дефекты, а также проблемы интеграции OWIN и ASP.NET
Переход на ASP.NET Core

www.synerdocs.ru

Другие ограничения

Слайд 72

www.synerdocs.ru Выводы

www.synerdocs.ru

Выводы

Слайд 73

Самостоятельно строить с нуля централизованную систему идентификации и аутентификации весьма сложно

Самостоятельно строить с нуля централизованную систему идентификации и аутентификации весьма сложно

и рискованно
Аналогично обстоит дело с самостоятельной реализацией таких стандартов, как OAuth 2.0 и OpenID Connect 1.0
IdentityServer позволяет значительно упростить две перечисленные выше задачи, но понимание стандартов также может существенно помочь

www.synerdocs.ru