2017-01-04 10 views
1

Этот вопрос на самом деле является непрерывным вопросом this SO мой вопрос. Я пытаюсь получить access_token и id_token с Identityserver4 с помощью потока кода авторизации.Как получить access_token, id_token с авторизации конечной точки IdentityServer4?

Но, если я попытаюсь получить доступ к конечной точке «Авторизовать», я получил ошибку HTTP 405 (метод не разрешен).

HTTP GET запрос

http://localhost:2000/connect/authorize? 
client_id=client 
&client_secret=secret 
&grant_type=authorization_code 
&username=admin 
&password=admin 
&response_type=id_token+token 
&scope=openid+profile+offline_access 

Клиент:

new Client 
{ 
    ClientId = "client", 
    ClientSecrets = { new Secret("secret".Sha256())},     
    AllowedGrantTypes = new List<string> { "authorization_code" }, 
    AccessTokenType = AccessTokenType.Jwt, 
    AllowedScopes = { StandardScopes.OpenId.Name, "api1" } 
} 

Пользователь:

new InMemoryUser 
    { 
    Subject = "1", 
    Username = "admin", 
    Password = "admin" 
    } 

Мой вопрос, как позвонить разрешить конечную точку, чтобы получить access_token и id_token? Что случилось в моей конфигурации «клиент» и «пользователь»?

+1

Вы включили ведение журнала? Это поможет вам обнаружить множество проблем с конфигурацией. –

ответ

1

Две идеи:

  1. HTTP-405 ошибка может быть связана с браузером паутины same origin policy. Однако ваш клиент выглядит как конфиденциальный клиент, а не клиент на основе браузера, и это означает, что одна и та же политика происхождения не применяется, если вы ошибочно не делаете этот запрос через веб-браузер.

  2. Эта ошибка HTTP 405 также может возникать при использовании HTTP-глагола, который не разрешен. Например, если вы используете POST, когда URL-адрес допускает только GET. Сделайте 100% уверенным, что вы делаете запрос GET.

1

У вас есть несколько вопросов. Вы смешиваете несколько потоков.

1) Если вы хотите получить id_token с конечной точки авторизации (а не конечной точки токена), вам нужно использовать гибридный поток ... не поток кода авторизации. См. here. Поэтому вам нужно будет соответствующим образом изменить свой тип ответа. Если ваш клиент был SPA, вы можете использовать неявный поток и получить id_token и access_token с конечной точки авторизации - но не поток кода авторизации.

2) client_secret не является параметром для конечной точки авторизации. Также нет grant_type. Для допустимых параметров см. here.

3) вы не отправляете имя пользователя и пароль в конечную точку авторизации ни при каких обстоятельствах. Если вы используете поток ресурсов владельца, вы отправляете их в конечную точку Token, но никогда не авторизуетесь. См. Приведенную выше ссылку с описанием допустимых параметров.

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

http://localhost:2000/connect/authorize? 
client_id=client 
&redirect_uri=<add redirect uri> 
&response_type=code+id_token+token 
&scope=openid+profile+api1 
&state=... 

Ответ от этого вызова будет включать в себя id_token и access_token.

new Client 
{ 
    ClientId = "client", 
    ClientName = "Your Client", 
    AllowedGrantTypes = GrantTypes.Hybrid, 

    ClientSecrets = 
    { 
     new Secret("secret".Sha256()) 
    }, 

     RedirectUris   = { "<add redirect uri>" }, 
     PostLogoutRedirectUris = { "<add post logout redirect uri>" }, 

    AllowedScopes = 
    { 
     IdentityServerConstants.StandardScopes.OpenId, 
     IdentityServerConstants.StandardScopes.Profile, 
     "api1" 
    } 
}; 
+0

https: // stackoverflow.com/questions/47979716/how-to-call-authorize-endpoint-without-login-prompt-in-gluu - любой вариант для этого? –