IdentityServer4 несколько проектов - PullRequest
0 голосов
/ 27 февраля 2019

Наше решение имеет 3 проекта.Давайте назовем их A, B и IdentityServer.Каждый проект может работать как отдельный сервис.Проекты A и B являются ASP.Net MVC. Проект IdentityServer является .Net Core (он использует IdentityServer4)

Front-End подключен к проекту A. База данных подключена к проекту B. Контроллеры из проекта A вызывают методы из контроллерапроекта B. И это работает нормально.

Мы добавили авторизацию в проект A, настроили IdentityServer, и это работает нормально.Когда интерфейс вызывает метод из контроллера проекта A, например:

[Authorize] public Task Methode (...) {}

, он работает нормально.Он перенаправляет пользователя на IdentityServer, запрашивает логин и авторизует его.

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

[Authorize]
public Task<ActionResult> MethodefromServiceA()
{
//do something
//calling methode from service B and sending User as ClaimsPrincipal
}


[Authorize]
public Task<ActionResult> MethodefromServiceB()
{
//it fails here - don't enter to this line (it enter's here when I remove [Authorise] pragma
}

Мы не знаем точно, как настроить IdentityServer4 и Project B, когда проектКонтроллер B получает заявки и токен от проекта A, он должен каким-то образом соединяться с IdentityServer и авторизовать токен (но не пользователя, потому что он уже авторизован, а у нас есть токен).

В Configuration.cs в IdentityServer у нас есть что-то вроде этого:

             new Client {
                ClientId = "A",
                ClientName = "A",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.Email,
                    "role",
                    "customAPI.write",
                    "customAPI.read"
                },
                RedirectUris = new List<string> {"http://localhost:64898"},
                PostLogoutRedirectUris = new List<string> { "http://localhost:64898/home/welcome" }
            },
              new Client {
                ClientId = "B",
                ClientName = "B",
                AllowedGrantTypes = GrantTypes.Implicit,
                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.Email,
                    "role",
                    "customAPI.write",
                    "customAPI.read"
                },
                RedirectUris = new List<string> {"http://localhost:57028"},
                PostLogoutRedirectUris = new List<string> { "http://localhost:57028" }
            },

и при запуске в проекте A:

        app.UseCookieAuthentication(new CookieAuthenticationOptions

        {
            AuthenticationType = "Cookies"
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            ClientId = "A",
            Authority = "https://localhost:44350/",
            RedirectUri = "http://localhost:64898",
            ResponseType = "id_token",
            Scope = "openid email",

            UseTokenLifetime = false,
            SignInAsAuthenticationType = "Cookies",
            PostLogoutRedirectUri = "http://localhost:64898/home/welcome",
        });

Я попытался добавить аналогичный проект B, но это ничего не меняет.

Буду рад, если смогу найти какой-нибудь пример, как выполнить многопроектную авторизацию с IdentityServer4.Как авторизовать токен в каждом проекте и т. Д. Решает ли [Authorize] прагма ситуацию, подобную этой, или это нужно делать по-другому или вручную?

Спасибо за помощь.Извините за мой английский

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Вам необходимо передать токен доступа с запросом, который вы делаете из Проекта А в Проект Б.

HttpClient client = new HttpClient();
client.SetBearerToken(bearerTokenString);
client.SendAsync("http://projectB/MehthodB");

На обоих серверных концах Проекта А и В должен быть блок проверки токена для проверки входящеготокен, как вы, вероятно, сделали для Project A.

Теперь вы можете повторно использовать тот же токен-носитель для вызова следующей службы, но если вам нужен определенный токен для этой службы, вам придется запросить его у IdentityServer.

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

0 голосов
/ 27 февраля 2019

Моя идея - добавить проект B в качестве ресурса и проект A в качестве ресурса и клиента на Identity Server, чтобы проект A мог получить доступ к ресурсам проекта B с помощью отдельного токена, созданного Identity Server.Просто предложение.

...