AISGorod.AspNetCore.Authentication.Esia 2.0.1

dotnet add package AISGorod.AspNetCore.Authentication.Esia --version 2.0.1
                    
NuGet\Install-Package AISGorod.AspNetCore.Authentication.Esia -Version 2.0.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AISGorod.AspNetCore.Authentication.Esia" Version="2.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AISGorod.AspNetCore.Authentication.Esia" Version="2.0.1" />
                    
Directory.Packages.props
<PackageReference Include="AISGorod.AspNetCore.Authentication.Esia" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AISGorod.AspNetCore.Authentication.Esia --version 2.0.1
                    
#r "nuget: AISGorod.AspNetCore.Authentication.Esia, 2.0.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AISGorod.AspNetCore.Authentication.Esia@2.0.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AISGorod.AspNetCore.Authentication.Esia&version=2.0.1
                    
Install as a Cake Addin
#tool nuget:?package=AISGorod.AspNetCore.Authentication.Esia&version=2.0.1
                    
Install as a Cake Tool

AISGorod.AspNetCore.Authentication.Esia

Build Status Nuget

Данная библиотека добавляет возможность авторизации через госуслуги (ЕСИА) по протоколу OpenID Connect, а также добавляет интерфейс доступа к REST-сервисам ЕСИА.

История изменений

Требования

  1. AspNetCore не ниже 8.0.
  2. Алгоритм формирования электронной подписи должен быть RS256 (указывается в настройках ИС на технологическом портале).

Подключение

  1. Добавьте NuGet-пакет AISGorod.AspNetCore.Authentication.Esia.
  2. Добавьте NuGet-пакет с криптографией, например, AISGorod.AspNetCore.Authentication.Esia.BouncyCastle.
  3. Добавьте в Startup.cs следующие строки (ниже данные для примера):
services
    .AddAuthentication(/*...*/)
    //...
    .AddEsia(options =>
    {
        options.Environment = EsiaEnvironmentType.Test;
        // options.EnvironmentInstance = ...; // можно использовать свою реализацию.
        options.Mnemonic = "МНЕМОНИКА_ВАШЕЙ_СИСТЕМЫ";
        options.Scope = ["fullname", "snils", "email", "mobile", "usr_org"];

        options.UseBouncyCastle(bouncyCastleOptions =>
        {
            bouncyCastleOptions.KeyFilePath = "/home/username/esia.key";
            bouncyCastleOptions.CertFilePath = "/home/username/esia.pem";
        });
    });
  1. Если хотите вызывать API-методы с использованием access_token через IEsiaRestService, убедитесь, что в приложении подключен HttpContextAccessor:
services.AddHttpContextAccessor();

Больше примеров в репозитории

Выполнение методов API через IEsiaRestService

Необходимо в контроллере (или где-нибудь ещё) запросить интерфейс IEsiaRestService. В нём есть метод CallAsync, который и отвечает за актуализацию токенов и общение с API ЕСИА.

Пример запроса:

var oId = User.Claims.First(i => i.Type == "sub").Value;
var contactsJson = await esiaRestService.CallAsync($"/rs/prns/{oId}/ctts?embed=(elements)", HttpMethod.Get);
ViewBag.Contacts = contactsJson.ToString(Newtonsoft.Json.Formatting.Indented);

Данный фрагмент кода получает oId пользователя, запрашивает все контакты и складывает их JSON-представление в ViewBag.

Получение настроек подключения к ЕСИА

Бывает полезно получить информацию о подключении к ЕСИА (адрес хоста, сертификат и т.д.) вне IEsiaRestService.

Это можно сделать путём запроса интерфейса IEsiaEnvironment.

Также открытыми являются классы TestEsiaEnvironment и ProductionEsiaEnvironment, от которых можно унаследоваться.

Пример использования настроек подключения смотрите в проекте EsiaNet8Sample на стартовой странице.

Получение дополнительных сведений о ФЛ в момент входа

Для упрощения процесса получения данных о физическом лице в момент его аутентификации в системе, в настройках IEsiaOptions объявлены флаги GetPrns<...>OnSignIn. Если они выбраны, то после получения access_token дополнительно в API ЕСИА отправляются запросы, связанные с этими флагами.

Примеры данных, которые можно дополнительно получить (при наличии соответствующего scope):

  • GetPrnsContactInformationOnSignIn - сведения о контактных данных ФЛ.
  • GetPrnsAddressesOnSignIn - сведения об адресах ФЛ.
  • GetPrnsDocumentsOnSignIn - сведения о документах ФЛ.

Как запустить примеры

Для того, чтобы запустить примеры, необходимо предварительно:

  • Определиться с поставщиком криптографии. Для целей тестирования можно использовать как trial-версию КриптоПРО CSP, так и BouncyCastle.
  • Затем необходимо выпустить тестовый сертификат ЭП, который понадобится для подписи запросов. Его выпуск целиком и полностью зависит от того поставщика криптографии, который был выбран ранее.
  • Затем необходимо подать заявку на регистрацию ИС в тестовой среде ЕСИА согласно регламенту взаимодействия с ЕСИА.

Теперь для запуска примера потребуется:

  • Изменить мнемонику ИС в ~/samples/EsiaSample/Program.cs.
  • Изменить путь до ключа (KeyFilePath) и сертификата (CertFilePath) в ~/samples/EsiaSample/Program.cs метод UseBouncyCastle(...). Или использовать КриптоПРО .NET. Там будет необходимо указать отпечаток сертификата ЭП и пароль от ключевого носителя (при наличии).

Если вы будете использовать режим подписи через CryptoPro, необходимо загрузить nuget пакеты. В проекте есть файл, который делает это автоматически:

Необходимо сделать файл скрипта исполняемым и запустить:

$ chmod +x utils/download_crypto_pro.sh
$ utils/download_crypto_pro.sh

Запуск примера можно проделать следующим образом:

$ dotnet build
$ dotnet run -p samples/EsiaNet8Sample/

Веб-сайт для демонстрации работы с ЕСИА будет доступен по адресу https://localhost:5000/.

Есть замечания / хочу внести вклад

Создавайте issue, предлагайте свои pull request-ы.

Вместе мы сможем сделать отличную библиотеку. 😃

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on AISGorod.AspNetCore.Authentication.Esia:

Package Downloads
AISGorod.AspNetCore.Authentication.Esia.BouncyCastle

Промежуточное ПО для ASP.NET Core для входа пользователей через портал госуслуг (ЕСИА). ESIA (gosuslugi) identity provider (middleware) for ASP.NET Core based on OpenID Connect.

AISGorod.AspNetCore.Authentication.Esia.CryptoPro

Промежуточное ПО для ASP.NET Core для входа пользователей через портал госуслуг (ЕСИА). ESIA (gosuslugi) identity provider (middleware) for ASP.NET Core based on OpenID Connect.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.0.1 294 5/12/2025
2.0.0 179 3/18/2025
2.0.0-alpha4 260 1/10/2025
2.0.0-alpha3 107 12/23/2024
2.0.0-alpha2 156 12/19/2024
2.0.0-alpha1 144 12/6/2024
1.6.1 190 12/2/2024
1.6.0 125 11/28/2024
1.6.0-preview1 113 11/28/2024
1.5.1 339 5/28/2024
1.5.0 2,151 11/25/2022
1.5.0-preview2 209 11/24/2022
1.5.0-preview1 234 11/21/2022
1.4.0 12,763 11/5/2020
1.3.0 778 6/1/2020
1.2.0 846 3/10/2020
1.1.0 802 12/30/2019
1.0.2 745 10/22/2019
1.0.1 811 8/27/2019
1.0.0 760 8/26/2019