Получить accessToken в Identity Server ASP.NET Core - PullRequest
0 голосов
/ 03 октября 2019

Я использую IdentityServer с приложениями ASP.NET Core MVC.

В IdentityServer мой клиент определен так:

new Client
    {
        ClientId = "admin.client",
        ClientName = "Admin Application",
        AllowedGrantTypes = GrantTypes.Implicit,
        ClientSecrets =
                        {
                            new Secret("secret".Sha256())
                        },
        RedirectUris = { "http://localhost:45876/signin-oidc" },
        PostLogoutRedirectUris = { "http://localhost:45876/signout-callback-oidc" },
        AllowedCorsOrigins = new[] { "http://localhost:45876/" },
        AllowedScopes =
                        {
                            IdentityServerConstants.StandardScopes.OpenId,
                            IdentityServerConstants.StandardScopes.Profile
                        },
        AllowOfflineAccess = true
}

И клиент регистрируется так:

services.AddAuthentication(
            options =>
                {
                    options.DefaultScheme = "Cookies";
                    options.DefaultChallengeScheme = "oidc";
                })
            .AddCookie("Cookies")
            .AddOpenIdConnect(
                "oidc",
                options =>
                    {
                        options.SignInScheme = "Cookies";

                        options.Authority = "http://localhost:5001/";
                        options.RequireHttpsMetadata = false;


                        options.ClientId = "admin.client";
                        options.ClientSecret = "secret";
                        options.ResponseType = "code id_token";
                        options.SaveTokens = true;
                        options.GetClaimsFromUserInfoEndpoint = true;

                        options.Scope.Add("openid");
                        options.Scope.Add("profile");
                    });

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

Я пытаюсь получить его с помощью этого кода:

 var token = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
 string accessToken = User.FindFirst("access_token")?.Value;

Оба они возвращают ноль.

Где моя проблема?

1 Ответ

1 голос
/ 03 октября 2019

Первая проблема заключается в том, что вы настраиваете клиентское приложение для использования Hybrid flow для взаимодействия с IdentityServer:

 options.ResponseType = "code id_token";

Но в конфигурации клиента разрешено использовать только Implicit flow:

 AllowedGrantTypes = GrantTypes.Implicit,

Это вызовет ошибку invalid grant type во время запроса аутентификации.

Вторая проблема заключается в том, что вы не настроили ApiResource:

public static IEnumerable<ApiResource> GetApis()
{
    return new List<ApiResource>
    {
        new ApiResource("api1", "My API")
    };
}

КлиентТакже не запрашивать разрешение на доступ к ресурсу API, хотя вы можете заставить ваше клиентское приложение аутентифицировать пользователя на сервере идентификации, оно вернет обратно ID token, а не Access token:

  • ID token содержит как минимум идентификатор пользователя (так называемое подчиненное утверждение) и информацию о том, как и когда пользователь аутентифицировался

  • Access token разрешает доступ к ресурсу API, содержат информацию о клиенте и пользователе (если имеется).

Поскольку вы используете веб-приложение (mvc в качестве клиентского приложения). Лучший выбор - использовать hybrid flow, который обеспечивает как доступ по API, так и аутентификацию пользователя. Здесь - пример кода.

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