Как можно правильно настроить взаимодействие с сервером авторизации при использовании C#?

Как можно организовать обмен идентификатора сессии на пользовательские данные между сервером Spring Boot OAuth2 и приложением на C# для обеспечения проверки сессии при каждом запросе к защищенному ресурсу в Spring Boot OAuth?
  • 25 января 2024 г. 15:59
Ответы на вопрос 2
Для настройки взаимодействия с сервером авторизации при использовании C# и обмена идентификатора сессии на пользовательские данные между сервером Spring Boot OAuth2 и C# приложением, вам необходимо реализовать несколько ключевых моментов:

## 1. Настройка сервера Spring Boot OAuth2:
У вас должен быть настроенный сервер авторизации, который будет работать по протоколу OAuth2. Это включает в себя создание клиентских идентификаторов, настройку точек доступа и возможно, поддержку JWT токенов.

## 2. Получение токена доступа:
Ваш C# клиент должен предоставить пользовательские учетные данные или другой механизм аутентификации, чтобы получить токен доступа от сервера авторизации. Это можно выполнить с помощью библиотеки, например IdentityModel, которая предоставляет функционал для взаимодействия с OAuth2 и OpenID Connect серверами.

Пример запроса токена с помощью IdentityModel:

```csharp
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://your-auth-server.com");

if (disco.IsError)
{
    Console.WriteLine(disco.Error);
    return;
}

var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
    Address = disco.TokenEndpoint,
    ClientId = "your-client-id",
    ClientSecret = "your-client-secret",
    UserName = "[email protected]",
    Password = "password"
});

if (tokenResponse.IsError)
{
    Console.WriteLine(tokenResponse.Error);
    return;
}

var accessToken = tokenResponse.AccessToken;
```

## 3. Авторизация запросов к защищенному ресурсу:
Как только у вас есть токен доступа, его необходимо использовать для авторизации запросов к защищенному ресурсу на вашем сервере Spring Boot OAuth2. Вы должны добавлять токен в HTTP заголовок `Authorization` в виде:

```csharp
client.SetBearerToken(accessToken);
```

Пример запроса к защищенному ресурсу:

```csharp
var response = await client.GetAsync("https://your-resource-server.com/protected");
if (!response.IsSuccessStatusCode)
{
    Console.WriteLine(response.StatusCode);
}
else
{
    var content = await response.Content.ReadAsStringAsync();
    Console.WriteLine(content);
}
```

## 4. Обмен идентификатора сессии на пользовательские данные:
Если вы используете идентификатор сессии (session ID), тогда ему нужно обмениваться между вашим C# клиентом и сервером авторизации для получения пользовательских данных.

- В случае если при аутентификации был возвращен ID токена (OIDC), его можно извлечь и декодировать в C#, чтобы получить информацию о пользователе.

- Если сервер авторизации поддерживает UserInfo endpoint (это часть OpenID Connect), то вы можете отправить запрос с токеном доступа для получения информации о пользователе.

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

```csharp
var userInfoResponse = await client.GetUserInfoAsync(new UserInfoRequest
{
    Address = disco.UserInfoEndpoint,
    Token = accessToken
});

if (userInfoResponse.IsError)
{
    Console.WriteLine(userInfoResponse.Error);
    return;
}

// Доступ к пользовательским данным
var claims = userInfoResponse.Claims;
```

Убедитесь, что ваш сервер Spring Boot OAuth2 корректно обрабатывает эти запросы и отвечает соответствующими пользовательскими данными.

## Обратите внимание:

- Настройте надежную и безопасную систему хранения токенов в вашем клиентском приложении на C#.
- Следите за сроком действия токенов и корректно обрабатывайте их обновление.
- Соблю
В OAuth используюся jwt токены преимущественно - про то чтобы передавать в куках не слышал/не реализовывал. 
Так как используется OAuth 2.0 , то все зависит от роли бэка на шарпе:
- Если это просто API без вьюшек (HTTP), то тут лучше пользователя заставить самому предоставлять JWT и валидировать его на своей стороне
- Если это веб-приложение, то нужно использовать Authorization Code flow

В обоих случаях, когда токен протухнет тебе передаст сервер с успешным ответов в поле expires_in.
Вот тут про OAuth flow - https://kinde.com/guides/authentication/protocols/...
А вот тут что поддерживает Spring Boot OAuth - https://docs.spring.io/spring-security-oauth2-boot...
Похожие вопросы