# Настройка аутентификации по токенам

Начиная с версии 2.184 система "Первая Форма" (в том числе интерфейс "Личный Кабинет") использует только аутентификацию по токенам. Ниже описаны настройки, которые должны быть в файле web.config:

1. enableSessionState\="false"

2\. По умолчанию

```xml
<sessionState mode="Off" />
```

(все остальные атрибуты у sessionState можно удалить)

Но если в приложении развернут модуль опросов, то

```xml
<sessionState mode="InProc" />
```

3\. Если в web.config прописан анонимный доступ для роутов, начинающихся с app/v1.0/api/Admin\_Manual/comments, этот анонимный доступ необходимо убрать. Можно остановить Windows-сервис aspnet\_state.

Также начиная с версии 2.184 токен должен передаваться в заголовке 1FormaAuth, а не в заголовке Authentication, как было ранее.

> ⚠️ **Миграция для существующих интеграций:** если ваши интеграции используют заголовок `Authentication`, необходимо заменить его на `1FormaAuth` во всех клиентах, обращающихся к API 1Ф.

## Настройки для "Первой Формы" с аутентификацией Forms

1\. Полностью закомментировать тег authentication.

2\. В секцию appSettings добавить следующие значения:

```xml
<add key="AuthByToken" value="true" />
<add key="AuthTokenExpiresInMinutes" value="1500" />
<add key="AuthTokenLoginUrl" value="~/Login.aspx"/>
```

3\. В секцию system.webServer / modules добавить:

```xml
<remove name="JwtAuthModule" />
<add name="JwtAuthModule" type="TaskCenter.Authorization.JwtAuthModule" preCondition="integratedMode" />
<remove name="FormsAuthenticationModule" />
<remove name="FormsAuthentication" />
```

4\. В конце списка тегов location добавить:

```xml
<location path="js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="component/GeoLocation.js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.0/api/DataSync/Import">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="Login.aspx">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="CustomerZone/Copied">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

5\. Добавить, если нет:

```xml
<location path="app/v1.0/api/auth/token">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.1/api/confirmKillPush">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api/info">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api/publications">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="img">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
  <system.webServer>
      <staticContent>
          <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Wed, 31 Dec 2030 00:00:00 GMT" />
      </staticContent>
      <httpProtocol>
          <customHeaders>
              <add name="Cache-Control" value="public,max-age=31536000" />
          </customHeaders>
      </httpProtocol>
  </system.webServer>
</location>
<location path="Login.js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

6\. Удалить, если было:

```xml
<location path="app/v1.0/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.1/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

## Настройки для "Первой Формы" с аутентификацией Windows

1\. Тег authentication остается:

```xml
<authentication mode="Windows"/>
```

2\. В секцию appSettings добавить следующие значения:        

```xml
<add key="AuthByToken" value="true" />
<add key="AuthTokenExpiresInMinutes" value="1500" />
```

3\. В конце списка тегов location добавить:

```xml
<location path="js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="component/GeoLocation.js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.0/api/DataSync/Import">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="Login.aspx">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="CustomerZone/Copied">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

4\. Добавить, если не было:

```xml
<location path="app/v1.0/api/auth/token">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.1/api/confirmKillPush">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api/info">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api/publications">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="img">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
  <system.webServer>
      <staticContent>
          <clientCache cacheControlMode="UseExpires" cacheControlMaxAge="1.00:00:00" httpExpires="Wed, 31 Dec 2030 00:00:00 GMT" />
      </staticContent>
      <httpProtocol>
          <customHeaders>
              <add name="Cache-Control" value="public,max-age=31536000" />
          </customHeaders>
      </httpProtocol>
  </system.webServer>
</location>
<location path="Login.js">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

5\. Удалить, если было:

```xml
<location path="app/v1.0/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.1/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
<location path="app/v1.2/api">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

## Настройка редиректа с Windows на forms приложение

Редирект с Windows на forms приложение необходимо настраивать, если нужна работа по протоколу http/2 и есть балансировка нагрузки через nginx.

При настроенном редиректе для работы в Windows-приложении пользователи должны проходить аутентификацию и получать токены в forms-приложении.

Порядок настройки редиректа:

1\. Настроить два приложения (с Windows и forms аутентификацией) в одном домене.

2\. В файле web.config приложения с forms-аутентификацией в секцию appSettings добавить:

```xml
<add key="WinToFormsRedirectWinUrl" value="https://win.myDomain.ru" />
<add key="SetCookieForUpperLevelDomain" value="true"/>
```

где вместо win.myDomain.ru указан базовый адрес приложения с Windows-аутентификацией.

3\. В файле web.config приложения с Windows-аутентификацией в секцию appSettings добавить:

```xml
<add key="WinToFormsRedirectFormsUrl" value="https://forms.myDomain.ru" />
<add key="SetCookieForUpperLevelDomain" value="true"/>
```

где вместо forms.myDomain.ru указан базовый адрес приложения с forms-аутентификацией.

4\. Пользователи должны заходить в приложение с forms-аутентификацией.

Проверка корректности настройки редиректа

1\. Зайти на адрес https://forms.myDomain.ru/default.aspx (вместо default.aspx может быть любой адрес).

2\. Если пользователь не авторизован, он перенаправляется на адрес https://win.myDomain.ru/default.aspx (response: Status: 302 Found; Location: https://win.myDomain.ru/default.aspx).

3\. У пользователя запрашивается Windows-аутентификация (в зависимости от настроек браузера и политик домена аутентификация может выполняться автоматически).

4\. Запрос проходит Windows-аутентификацию IIS и код "Первой Формы" выдает браузеру файл cookie 1FormaAuth, в котором содержится токен "Первой Формы". Одновременно пользователь перенаправляется на адрес https://forms.myDomain.ru/default.aspx (response: Status: 302 Found; Location: https://forms.myDomain.ru/default.aspx).

5\. Запрос от браузера пользователя вместе с файлом cookie перенаправляется на адрес https://forms.myDomain.ru/default.aspx.

В результате пользователь работает в forms-приложении, но аутентификация происходит через Windows-приложение.

Если пользователь неактивен в "Первой Форме" в течение какого-то времени, файл cookie становится невалидным, и forms-приложение перенаправляет пользователя обратно на Windows-приложение, чтобы выдать новый файл cookie.

```mermaid
sequenceDiagram
    participant B as Браузер
    participant FA as Forms-приложение
    participant WA as Windows-приложение
    B->>FA: запрос (например /default.aspx)
    alt пользователь не авторизован
        FA-->>B: 302 Found на Windows-приложение
        B->>WA: запрос
        WA->>WA: Windows-аутентификация (IIS)
        WA-->>B: cookie 1FormaAuth с токеном и 302 на Forms-приложение
        B->>FA: повторный запрос с cookie
    end
    FA-->>B: работа в Forms-приложении
    Note over B,FA: по истечении cookie Forms снова редиректит на Windows за новым токеном
```

## Настройки для Личного Кабинета

1\. Полностью закомментировать тег authentication.

2\. В секцию appSettings добавить следующие значения:

```xml
<add key="AuthByToken" value="true" />
<add key="AuthTokenExpiresInMinutes" value="1500" />
<add key="AuthTokenLoginUrl" value="~/Login"/>
```

3\. В секцию system.webServer / modules добавить:

```xml
<remove name="JwtAuthModule" />
<add name="JwtAuthModule" type="CustomerZoneSPA.Authorization.JwtAuthModule" preCondition="integratedMode" />
<remove name="FormsAuthenticationModule" />
<remove name="FormsAuthentication" />
```

4\. В конце списка тегов location добавить:

```xml
<location path="Login">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

## Настройки для модуля опросов

1\. Полностью закомментировать тег authentication.

2\. В секцию appSettings добавить следующие значения:

```xml
<add key="AuthByToken" value="true" />
<add key="AuthTokenExpiresInMinutes" value="1500" />
<add key="AuthTokenLoginUrl" value="~/default.aspx"/>
```

3\. Перед закрытием секции system.webServer добавить:

```xml
<modules>
  <remove name="JwtAuthModule" />
  <add name="JwtAuthModule" type="Votations.NSurvey.WebAdmin.Authorization.JwtAuthModule" preCondition="integratedMode" />
  <remove name="FormsAuthenticationModule" />
  <remove name="FormsAuthentication" />
</modules>
```

4\. Если опросы развернуты отдельно, данный пункт не выполняется.  
Если опросы развернуты в виртуальной директории в "Первой Форме", то дополнительно к настройкам аутентификации "Первой Формы" необходимо выполнить следующие действия:

- в элемент system.web добавить

```xml
<sessionState mode="InProc" />
```

- для элемента system.web/pages указать атрибут enableSessionState\="true"

```xml
<pages validateRequest="false" controlRenderingCompatibilityVersion="4.0" clientIDMode="AutoID" enableSessionState="true">
```

## Двухфакторная аутентификация

В файле web.config приложения включить анонимный доступ для API-методов:

```xml
<location path="api/auth/token/code">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>

<location path="api/auth/code">
  <system.web>
      <authorization>
          <allow users="?" />
      </authorization>
  </system.web>
</location>
```

## Безопасность

При активации правил логирования для компонентов аутентификации в файлы логов не попадают полные значения токенов. Токены записываются в усеченном формате, где отображается только полезная нагрузка (payload), а заголовок (header) и подпись (signature) заменены на статические метки. Это исключает возможность использования записанных в логи данных для несанкционированного доступа, так как без заголовка и подписи payload не может быть верифицирован. Токены генерируются при любых операциях с аутентификацией: входе, выходе, обновлении токена или истечении его срока действия. Токены не сохраняются в файлах логов, откуда их потенциально можно похитить.
