IdentityServer 3 id_token автоматический вход - PullRequest
0 голосов
/ 02 октября 2019

Я недавно начал работать над новым проектом (несколько месяцев назад), и клиент попросил меня реализовать механизм автоматического входа в систему.

Это был первый раз, когда я использовал 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
...