Я недавно начал работать над новым проектом (несколько месяцев назад), и клиент попросил меня реализовать механизм автоматического входа в систему.
Это был первый раз, когда я использовал IdentityServer и концепцию oAuth2 иOpenId (никто не знает, как он работает у меня и так было 2 года). Во всяком случае, мне удалось создать обходной путь для реализации так называемого автоматического входа, который они хотели, используя новый clientId для «ResourceOwner». В основном приложении все работает нормально, проблема в том, что когда пользователь переходит ко второму приложению, происходит сбой входа в систему этого приложения, и я обнаружил, что это происходит из-за отсутствия id_token.
Я много пробовалвещей, чтобы получить id_token при использовании ResourecOwner, но безрезультатно. Ищите в Интернете ЗДЕСЬ , что ResourceOwner не возвращает id_token, только "Неявный" и "Код авторизации". Также поищите в Интернете, чтобы узнать, как заставить работать Implicit или код авторизации, но мне удалось найти код для сервера идентификации 4 или, в случае сервера идентификации 3, только код, используемый при запуске. Класс Auth.cs проекта.
1- Это клиент, настроенный:
new Client
{
ClientName = "Auto Login",
ClientId = "autoLogin",
Flow = Flows.ResourceOwner,
Enabled = true,
AccessTokenType = AccessTokenType.Reference,
AccessTokenLifetime = 86400,
ClientSecrets = new List<Secret>
{
new Secret("wontSayIt".Sha256())
},
AllowedScopes = new List<string>
{
"openid",
"profile",
"roles",
"sso.api",
"portal.accesstoken",
"portal.identitytoken",
StandardScopes.OfflineAccess.Name
},
RefreshTokenUsage = TokenUsage.OneTimeOnly,
RefreshTokenExpiration = TokenExpiration.Absolute,
UpdateAccessTokenClaimsOnRefresh = true,
PrefixClientClaims = false
},
2- Это код, который я использую для получения access_token и refresh_token
TokenClient client = new TokenClient(SSOTokenEndpoint, clientId, clientSecret);
Task<TokenResponse> tokenResponseResult = client.RequestResourceOwnerPasswordAsync(userEmail, userPassword, scope);
TokenResponse tokenResponse = tokenResponseResult.Result;
3- После шага 2 я могу получить access_token и userinfo, а затем войти в систему как ResourceOwner
ПРИМЕЧАНИЕ: При использовании «обычного» входа в основное приложение (вставкаимя пользователя и адрес электронной почты на экране входа в систему), все другие приложения работают нормально, при использовании этого «автоматического входа» работают только основные приложения, все остальные не работают, и я обнаружил, проверив де логи, что они получают subjectId = unknown
Вот журнал ответов при входе во второе приложение с «обычным»:
w3wp.exe Information: 0 : 2019-10-02 14:41:33.825 +01:00 [Information] "Authorize request validation success"
"{
\"ClientId\": \"webAppSecondary\",
\"ClientName\": \"web App Secondary\",
\"RedirectUri\": \"https://localhost:44391/externallogincallback\",
\"AllowedRedirectUris\": [
\"https://localhost:44391/externallogincallback\"
],
\"SubjectId\": \"0b5ee3c1-a372-4e36-b49f-67c775cbb7cd\",
\"ResponseType\": \"id_token\",
\"ResponseMode\": \"fragment\",
\"Flow\": \"Implicit\",
\"RequestedScopes\": \"openid\",
\"State\": \"7d1a0179daff43a484f18373f77bff53\",
\"Nonce\": \"d726f7aabc5a47188572abf9fb700c2d\",
\"PromptMode\": \"none\",
\"SessionId\": \"4b2fcfdb509683d4902cc4096427e2d9\",
\"Raw\": {
\"client_id\": \"webAppSecondary\",
\"redirect_uri\": \"https://localhost:44391/externallogincallback\",
\"response_type\": \"id_token\",
\"scope\": \"openid\",
\"state\": \"7d1a0179daff43a484f18373f77bff53\",
\"nonce\": \"d726f7aabc5a47188572abf9fb700c2d\",
\"prompt\": \"none\"
}
}"
w3wp.exe Information: 0 : 2019-10-02 14:41:34.001 +01:00 [Information] Creating Implicit Flow response.
2019-10-02 14:41:34.004 +01:00 [Debug] Creating identity token
w3wp.exe Information: 0 : 2019-10-02 14:41:34.005 +01:00 [Information] Getting claims for identity token for subject: 0b5ee3c1-a372-4e36-b49f-67c775cbb7cd
2019-10-02 14:41:34.268 +01:00 [Debug] Creating JWT identity token
2019-10-02 14:41:34.277 +01:00 [Debug] Adding client "webAppSecondary" to client list cookie for subject "0b5ee3c1-a372-4e36-b49f-67c775cbb7cd"
Вот журнал ответов при входе во второе приложение с«автоматический вход»:
w3wp.exe Information: 0 : 2019-10-02 14:44:52.871 +01:00 [Information] "Authorize request validation success"
"{
\"ClientId\": \"webAppSecondary\",
\"ClientName\": \"web App Secondary\",
\"RedirectUri\": \"https://localhost:44391/externallogincallback\",
\"AllowedRedirectUris\": [
\"https://localhost:44391/externallogincallback\"
],
\"SubjectId\": \"unknown\",
\"ResponseType\": \"id_token\",
\"ResponseMode\": \"fragment\",
\"Flow\": \"Implicit\",
\"RequestedScopes\": \"openid\",
\"State\": \"d08713eedca74d1b9f5904f15a4fc154\",
\"Nonce\": \"7e961d2c9f4a4eb9b19f510b0ab4d2b2\",
\"PromptMode\": \"none\",
\"Raw\": {
\"client_id\": \"webAppSecondary\",
\"redirect_uri\": \"https://localhost:44391/externallogincallback\",
\"response_type\": \"id_token\",
\"scope\": \"openid\",
\"state\": \"d08713eedca74d1b9f5904f15a4fc154\",
\"nonce\": \"7e961d2c9f4a4eb9b19f510b0ab4d2b2\",
\"prompt\": \"none\"
}
}"
w3wp.exe Information: 0 : 2019-10-02 14:44:52.878 +01:00 [Information] User is not authenticated. Redirecting to login.
w3wp.exe Information: 0 : 2019-10-02 14:44:52.880 +01:00 [Information] prompt=none was requested. But user is not authenticated.
w3wp.exe Information: 0 : 2019-10-02 14:44:52.887 +01:00 [Information] End authorize request