Защита клиента в IdentityServer4 - PullRequest
0 голосов
/ 07 июня 2018

У меня есть следующий сценарий:

enter image description here

Я не совсем понимаю, как настроить API 2 в IdentityServer4,как мне кажется, это как Client (поскольку он потребляет ресурсы, предоставляемые API 1 ), так и ApiResource (так как я хочу защитить его, чтобы только зарегистрированные пользователиможет получить к нему доступ).

Я рассмотрел настройку API 2 как Client и защиту его с помощью аутентификации cookie.Я думаю, что это похоже на то, что они делают в MvcClient в их примере .Однако мне это не нравится, потому что вся информация о пользователе хранится на стороне сервера, поэтому мое приложение JavaScript не может узнать имя пользователя, адрес электронной почты и т. Д.

Как лучше всегосправиться с этим сценарием?

1 Ответ

0 голосов
/ 08 июня 2018

По сути, вам необходимо защитить оба ваших API с помощью Identity Server.Что-то вроде:

API 1 Startup.cs :

services.AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme) 
.AddIdentityServerAuthentication(options => 
{ 
    options.Authority = "https://localhost:5000"; 
    options.SupportedTokens = SupportedTokens.Both; 
    options.RequireHttpsMetadata = false; 
    options.ApiName = "api1"; 
});

То же самое для API 2, но options.ApiName должно быть другим.Затем вашему клиенту javascript при создании на стороне Identity Server должен быть разрешен доступ к этим 2 API-интерфейсам (разрешенные области действия):

new Client
    {
        ClientId = "your.js.client.id",

        AllowedGrantTypes = GrantTypes.Implicit,
        AllowAccessTokensViaBrowser = true,

        RedirectUris =           { "http://localhost:5003/callback.html" },
        PostLogoutRedirectUris = { "http://localhost:5003/index.html" },
        AllowedCorsOrigins =     { "http://localhost:5003" },

        AllowedScopes =
        {
            "api2",
            "api1"
        }
    }

Этот код взят из официальной документации .

А затем в API 2, когда вы хотите вызвать контроллер API 1, вам нужно что-то вроде:

var client = new HttpClient();
client.SetBearerToken(accessToken);
client.GetStringAsync("https://localhost/api1/test");

Где вы получите access_token:

[Authorize]
public async Task<IActionResult> ControllerMethodInApi2()
{
    var accessToken = await context.HttpContext.GetTokenAsync("access_token"); 

    return View();
}

Это должно сработать для вас.

...