Наше решение имеет 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] прагма ситуацию, подобную этой, или это нужно делать по-другому или вручную?
Спасибо за помощь.Извините за мой английский