Как вернуть токен аутентификации из метода .Net Core [Авторизовать]

#c# #asp.net-core #jwt #openid-connect

#c# #asp.net-core #jwt #OpenID-connect

Вопрос:

Мое основное приложение делегирует аутентификацию приложению AuthService, запрашивая у него аутентификацию у поставщика удостоверений через OpenID Connect и возвращает токен.

     [Authorize]
    [HttpGet("Login")]
    public IActionResult Login()
    {
        return Ok(
        {
            Token = ?
        }, OpenIdConnectDefaults.AuthenticationScheme);
    }
  

У меня есть метод API с [Authorize] атрибутом. Пользователю предлагается войти в систему, если он еще не прошел проверку подлинности, а затем запускается метод. Мой вопрос в том, могу ли я получить доступ к токену оттуда, чтобы я мог передать его в ответе?

Есть ли простой способ добиться этого?

Ответ №1:

Вы можете получить эту информацию, введя IHttpContextAccessor службу в контроллер и определив службу в классе startup.cs

 public class HomeController
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public HomeController(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
        //check the _httpContextAccessor.HttpContext object for information about the already logged user
    }
}
  

Startup.cs

 public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
  

Комментарии:

1. Где я могу найти его в HttpContextAccessor — я просмотрел AuthenticateAsync и GetTokenAsync, но я не знаю имени токена.

2. К вашему сведению — я нашел его в разделе HttpContext.GetTokenAsync(OpenIdConnectDefaults. Схема аутентификации, «id_token»). Результат;

3. Отлично! надеюсь, это поможет. Если мой ответ поможет вам решить вашу проблему, не забудьте отметить его

Ответ №2:

Атрибут [Authorize], который вы добавляете к методу, означает, что вы ограничиваете доступ к методу только авторизованным пользователям, поэтому включение этого атрибута в метод входа в систему не имеет смысла, поскольку для его вызова вам нужно пройти проверку подлинности.

То, что вы ищете, это

 [Authorize]
public class AccountController : Controller
{
    [AllowAnonymous]
    public ActionResult Login()
    {
    }
    [Authorize]
    public ActionResult Logout()
    {
    }
}
  

Что касается того, как сгенерировать токен, вам необходимо, чтобы поставщик удостоверений получал имя пользователя и пароль, проверял их и создавал токен с ролями и привилегиями.

Я бы посоветовал взглянуть на сервер идентификации 4 для генерации токенов.

Для получения информации о том, как подключить его к OpenID, см. Добавление аутентификации пользователя с помощью OpenID Connect

Комментарии:

1. Когда я использую атрибут [Авторизовать], не прошедшим проверку подлинности пользователям предлагается войти в систему. Я уже подключен к OIDC, и он где-то возвращает токен. Мой вопрос в том, как получить к нему доступ из метода API.

Ответ №3:

вы должны получить токен для доступа к методу атрибута авторизации.

ссылка на это

Ответ №4:

Вот что я придумал, просмотрев предложения здесь:

     [AllowAnonymous]
    [HttpGet("Login")]
    public IActionResult Login()
    {
        return Challenge(new AuthenticationProperties
        {
            RedirectUri = $"{HttpContext.Request.PathBase.Value}/GetToken"
        }, OpenIdConnectDefaults.AuthenticationScheme);
    }

    [Authorize(AuthenticationSchemes = OpenIdConnectDefaults.AuthenticationScheme)]
    [HttpGet("GetToken")]
    public IActionResult GetToken()
    {
        var token = _contextAccessor.HttpContext.GetTokenAsync(OpenIdConnectDefaults.AuthenticationScheme, "id_token").Resu<

        return Ok(new
        {
            Token = token
        });
    }
  

Я объединил два API. С точки зрения клиентского приложения он вызывает API входа в систему и получает токен в качестве результата. За кулисами API входа перенаправляется на второй API для получения и возврата токена.

Обновить:

Повторите это через некоторое время на случай, если кто-нибудь это увидит. Я точно не помню, как, но я думаю, что у меня была проблема с вышеуказанным подходом.

В конце я использовал OnSignedIn CookieAuthenticationHandler событие для перехвата токена и вернул его с ответом в файле cookie. API входа в систему по-прежнему возвращает Challenge запрос.