Selaa lähdekoodia

авторизация

Евгений Колесников 1 vuosi sitten
vanhempi
sitoutus
ae8cc90886
1 muutettua tiedostoa jossa 20 lisäystä ja 54 poistoa
  1. 20 54
      articles/api_auth.md

+ 20 - 54
articles/api_auth.md

@@ -18,26 +18,26 @@
 
 ### Аутентификация
 
-Для выполнения аутентификации в конвейере обработки запроса отвечает специальный компонент middleware - AuthenticationMiddleware. Для встраивания этого middleware в конвейер применяется метод расширения **UseAuthentication()**
+Для выполнения аутентификации в конвейере обработки запроса отвечает специальный компонент **middleware** - **AuthenticationMiddleware**. Для встраивания этого **middleware** в конвейер применяется метод расширения **UseAuthentication()**
 
-Следует отметить, что метод **UseAuthentication()** должен встраиваться в конвейер до любых компонентов middleware, которые используют аутентификацию пользователей (но после **Swagger**).
+Следует отметить, что метод **UseAuthentication()** должен встраиваться в конвейер до любых компонентов **middleware**, которые используют аутентификацию пользователей (но после **Swagger**).
 
-Для выполнения аутентификации этот компонент использует сервисы аутентификации, в частности, сервис IAuthenticationService, которые регистрируются в приложении с помощью метода **AddAuthentication()**:
+Для выполнения аутентификации этот компонент использует сервисы аутентификации, в частности, сервис **IAuthenticationService**, которые регистрируются в приложении с помощью метода _AddAuthentication()_:
 
-В качестве параметров метод AddAuthentication() может принимать схему аутентификации в виде строки и делегат, который устанавливает опции аутентификации - объект AuthenticationOptions.
+В качестве параметров метод _AddAuthentication()_ может принимать схему аутентификации в виде строки и делегат, который устанавливает опции аутентификации - объект **AuthenticationOptions**.
 
 Наиболее расcпространенные схемы аутентификации:
 
-* **Basic**: аутентификация на основе имени и пароля, мы в дальнейшем будем использовть его, т.к. он используется на соревнованиях. Но в реальной разработке он уже не используется и в **ASP.NET Core** не имеет реализации. Есть сторонние пакеты, но мы напишем свою реализацию.
+* **Basic**: аутентификация на основе имени и пароля, мы в дальнейшем будем использовть его, т.к. он используется на соревнованиях. Но в реальной разработке он используется редко и в **ASP.NET Core** не имеет реализации. Есть сторонние пакеты, но мы напишем свою реализацию.
 * **Cookies**: аутентификация на основе куки. Хранится в константе `CookieAuthenticationDefaults.AuthenticationScheme`
-* **Bearer**: аутентификация на основе jwt-токенов. Хранится в константе `JwtBearerDefaults.AuthenticationScheme` (вообще токены могут быть любые, а не только JWT)
+* **Bearer**: аутентификация на основе **JWT**-токенов. Хранится в константе `JwtBearerDefaults.AuthenticationScheme` (вообще токены могут быть любые, а не только **JWT**)
 
 **Схема аутентификации** позволяет выбирать определенный обработчик аутентификации. **Обработчик аутентификации** собственно и выполняет непосредственную аутентификацию пользователей на основе данных запроса и исходя из схемы аутентификации.
 
-Например, для аутентификации с помощью куки передается схема "Cookies". Соответственно для аутентификации пользователя будет выбираться встроенный обработчик аутентификации - класс `Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler`, который на основе полученных в запросе cookie выполняет аутентификацию.
+Например, для аутентификации с помощью куки передается схема "Cookies". Соответственно для аутентификации пользователя будет выбираться встроенный обработчик аутентификации - класс `Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationHandler`, который на основе полученных в запросе **cookie** выполняет аутентификацию.
+
+А если используется схема "Bearer", то это значит, что для аутентификации будет использоваться **JWT**-токен, а в качестве обработчика аутентификации будет применяться класс `Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler`. Стоит отметить, что для аутентификации с помощью **JWT**-токенов необходимо добавить в проект через **Nuget** пакет `Microsoft.AspNetCore.Authentication.JwtBearer`
 
-А если используется схема "Bearer", то это значит, что для аутентификации будет использоваться jwt-токен, а в качестве обработчика аутентификации будет применяться класс `Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler`. Стоит отметить, что для аутентификации с помощью jwt-токенов необходимо добавить в проект через **Nuget** пакет `Microsoft.AspNetCore.Authentication.JwtBearer`
-``
 При чем в ASP.NET Core мы не ограничены встроенными схемами аутентификации и можем создавать свои кастомные схемы и под них своих обработчиков аутентификации.
 
 Кроме применения схемы аутентификации необходимо подключить аутентификацию определенного типа. Для этого можно использовать следуюшие методы:
@@ -117,7 +117,7 @@ Authorization: <тип авторизации> <данные для автори
 При базовой аторизации 
 
 * тип авторизации: **Basic**
-* данные для авторизации: строка в формате `логин:пароль` закодированная base64
+* данные для авторизации: строка в формате `логин:пароль` закодированная **base64**
 
 ```
 Authorization: Basic base64encodedloginandpassword
@@ -252,54 +252,20 @@ Authorization: Basic base64encodedloginandpassword
     app.MapGet("/", () => "Hello World!")
         .RequireAuthorization();
     ```    
+В **Visual Studio Code** есть плагин _REST Client_, в нём запрос выглядит так:
 
-1. Настройка авторизации в **Swagger**
-
-    >Взял [отсюда](https://habr.com/ru/companies/simbirsoft/articles/707108/)
-
-    В **Swagger** можно настроить заполнение логина и пароля, чтобы соответствующий заголовок автоматически добавлялся в запросы. Для этого надо добавить параметры в метод **AddSwaggerGen**:
-
-    ```cs
-    builder.Services.AddSwaggerGen(options =>
-    {
-        // Метод AddSecurityDefinition добавляет
-        // кнопку "Авторизовать" в верхней чести страницы
-        // которая настраивает заголовок авторизации
-        options.AddSecurityDefinition("Basic", new OpenApiSecurityScheme
-        {
-            Description = "Введите логин и пароль",
-            Name = "Authorization",
-            In = ParameterLocation.Header,
-            Type = SecuritySchemeType.Http,
-            Scheme = "Basic"
-        });
-        // Метод AddSecurityRequirement 
-        // добавит заголовок авторизации 
-        // к каждой конечной точке при отправке запроса:
-        options.AddSecurityRequirement(new OpenApiSecurityRequirement
-        {
-            {
-                new OpenApiSecurityScheme
-                {
-                    Reference = new OpenApiReference
-                    {
-                        Type = ReferenceType.SecurityScheme,
-                        Id = "Basic"
-                    }
-                },
-                new List<string>()
-            }
-        });
-    });
-    ```
+```http
+GET http://localhost:8080/product
+Authorization: Basic admin:password
+```
 
-**Swagger** в этот проект я не прикручивал, вы можете сделать запрос из **Postman**-а или из плагина к VSCode (_REST Client_)
+т.е. можно логин и пароль писать "как есть".
 
_REST Client_ запрос выглядит так:
+В **Visual Studio** так не работает, необходимо упаковать эти параметры в base64 (можно использовать онлайн-конвертеры)
 
-```
-GET http://localhost:8080/
-Authorization: Basic admin:password
+```http
+GET http://localhost:8080/product
+Authorization: Basic YWRtaW46cGFzc3dvcmQ=
 ```
 
 В логах сервера видно как выковыриваются данные для авторизации: