.NET библиотека для подключения к ЕСИА по протоколу OAuth 2.0 и OpenId Connect 1.0, сервисы REST.
Информация об ЕСИА на сайте Минкомсвязь России: Единая система идентификации и аутентификации (ЕСИА)
ESIA OAuth 2.0 client to russian government services for .NET framework.
Здесь представлена документация по Esia.NET для .NET Core 3.1 и выше. Nuget-пакеты версии 1.0 и выше.
Для классического .NET Framework документация и реализация находится в ветке dot-net-classic. Также используйте Nuget-пакеты версии 0.1.
Необходимо установить Nuget-пакет EsiaNET.AspNetCore.Authentication:
PM> Install-Package EsiaNET.AspNetCore.Authentication
Версия пакета 6.0.0 поддерживает .NET Core 3.1, .NET 5 и .NET 6.
Далее добавить ЕСИА провайдер в Startup.ConfigureServices. Это внешний провайдер авторизации через ЕСИА в ASP.NET Core, подобно авторизации через Google, Facebook, Twitter. При добавлении требуется указать параметры подключения к ЕСИА и сведения о системе-клиенте. Многие параметры имеют значения по умолчанию.
services.AddAuthentication().AddEsia(options =>{options.ClientId="YOUR_CLIENT_SYSTEM_ID";// Идентификатор вашей систему. Обязателенoptions.AuthorizationEndpoint=EsiaConsts.EsiaAuthUrl;// Адрес перенаправления на страницу предоставления прав доступа в ЕСИА - либо тестовый, либо рабочий. По умолчанию - рабочий https://esia.gosuslugi.ru/aas/oauth2/acoptions.TokenEndpoint=EsiaConsts.EsiaTokenUrl;// https-адрес ЕСИА для получения маркера доступа - либо тестовый, либо рабочий. По умолчанию - рабочий https://esia.gosuslugi.ru/aas/oauth2/te// Провайдер для подписания запроса к ЕСИА и проверки токена. Обязателен// Комментарии нижеoptions.SignProvider=newSignProvider();options.VerifyTokenSignature=false;// Не проверять подпись возвращемого токена, по умолчанию - falseoptions.SaveTokens=true;// Сохранить токен в AuthenticationProperties, см. официальную документацию по AspNet Core// Требуемый scope. Обязателенoptions.Scope.Add("openid");options.Scope.Add("fullname");options.Scope.Add("id_doc");// Параметры доспупа к REST ЕСИА. Необязательно. По умолчанию использует параметры продуктовой среды.// Для тестовой поменяйте EsiaRestOptions.RestUri на EsiaConsts.EsiaRestTestUrloptions.RestOptions=newEsiaRestOptions();// Event handlersoptions.Events.OnCreatingTicket= c =>{varaccessToken=c.AccessToken;returnTask.CompletedTask;};});Теперь вы можете пройти процедуру аутентификации через ЕСИА (External login). После входа, с помощью маркера доступа можно обращаться к REST ЕСИА.
varesiaClient=newEsiaClient(newEsiaRestOptions(),token);Теперь вы можете получить данные из REST сервисов ЕСИА.
// Получим данные о пользователеvarpersonInfo=awaitesiaClient.GetPersonInfoAsync();// Пользователь не подтвержден - выводим ошибкуif(!personInfo.Trusted)thrownewException("Данные не подтверждены");// Получаем контактыvarcontacts=awaitesiaClient.GetPersonContactsAsync();// Получаем документы пользователяvardocs=awaitesiaClient.GetPersonDocsAsync();// Получаем адреса пользователяvaraddrs=awaitesiaClient.GetPersonAddrsAsync();// Получаем транспортные средстваvarvehicles=awaitesiaClient.GetPersonVehiclesAsync();// Получаем детейvarkids=awaitesiaClient.GetPersonKidsAsync();foreach(varchildinkids){// Получаем документы ребенкаvarchildDoc=awaitesiaClient.GetPersonChildDocsAsync(child.Id);}Универсальный метод для получения данных из ЕСИА
asyncTask<HttpResponseMessage>SendAsync(HttpMethodmethod,stringrequestUri,IList<KeyValuePair<string,string>>requestParams=null,IList<KeyValuePair<string,string>>headers=null)Данный метод позволяет выполнить http запрос на сервисы ЕСИА (requestUri) с параметрами requestParams (передаются как FormUrlEncodedContent) и дополнительными headers.
Дополнительные методы:
asyncTask<string>GetAsync(stringrequestUri)// Запрос GET, параметры в uriasyncTask<string>PostAsync(stringrequestUri,IList<KeyValuePair<string,string>>requestParams=null)// Запрос POST, параметры FormUrlEncodedContentПровайдер обязателен. Должен реализовать интерфейс ISignProvider.
Существует DefaultSignProvider, который реализует подпись и проверку через сертификат клиент-системы ЕСИА.
// Провайдер для получения сертификата системы-клиента. Обязан вернуть сертификат. В данном примере сертификат ищется на локальной машине по серийному номеру. ОбязателенSignProvider=EsiaAuthenticationOptions.CreateSignProvider(()=>{// Будем искать сертификат в личном хранилище на локальной машинеX509StorestoreMy=newX509Store(StoreName.My,StoreLocation.LocalMachine);storeMy.Open(OpenFlags.OpenExistingOnly);X509Certificate2CollectioncertColl=storeMy.Certificates.Find(X509FindType.FindBySerialNumber,"SERIAL_ID",false);storeMy.Close();returncertColl[0];},// Action должен вернуть сертификат ЕСИА тестовый или рабочий. В данном примере ищем сертификат по его пути, указанном в конфигурационном файле()=>newX509Certificate2(<путь к сертификату ЕСИА>))В связи с тем что реализовать использование ГОСТ криптографии в .NET Core крайне проблематично, в примерах провайдер реализован в виде отдельного .NET Framework веб-приложения. Вы можете использовать свою реализацию. Смотрите пример. DefaultSignProvider в текущем виде работает только в Windows и классическом .NET Framework.
Также необходимо иметь специализированное сертифицированное ПО для работы с ГОСТ криптографией.
Пример интеграции Esia.NET и ASP.NET Core для реализации авторизации через ЕСИА и получения данных. Вставьте свои данные для работы примера. В файле EsiaNET.Mvc\Startup.cs - данные клиент-системы ЕСИА. В файле SignerApp\Controllers\SignController.cs - серийный номер вашего ГОСТ сертификата. Как писалось рание из-за проблем ГОСТ-криптографии в .NET Core, подпись и проверка реализованы в отдельном .Net Framework приложении SignerApp. Для работы примера оба приложения должны быть запущены. Стартовый проект - EsiaNET.Mvc.
Добро пожаловать в Issues или почту lettapost@gmail.com.