2017-01-17 2 views
1

Я пытаюсь подключить собственное мобильное приложение (xamarin) к Identity Server. Первоначально я установил, что поток является неявным, и мне сказали, что он неверен. Поэтому я изменил его поток кода авторизации.Подключение клиента Xamarin к Identity Server4

Вот как мое определение клиента выглядит

new Client 
    { 
     ClientId = "Xamarin", 
     ClientName = "Xamarin Client", 
     AllowedGrantTypes = GrantTypes.Code, 
     AllowAccessTokensViaBrowser = true, 
     RedirectUris = { "http://xx.xx.xx.xx/signin-oidc" }, 
     PostLogoutRedirectUris = { "http://xx.xx.xx.xx/signin-oidc" }, 
     AllowedCorsOrigins = { "http://xx.xx.xx.xx" }, 
     AllowedScopes = 
      { 
       StandardScopes.OpenId.Name, 
       StandardScopes.Profile.Name, 
       "api1" 
      }, 
     RequireConsent = false 
     } 

И из моего Xamarin приложения, это, как я подключиться к серверу идентификационной информации.

void LoginButton_Clicked(object sender, EventArgs e) 
    { 
     StartFlow("token", "api1"); 
    } 

    public void StartFlow(string responseType, string scope) 
    { 
     var authorizeRequest = 
      new AuthorizeRequest("http://xx.xx.xx.xx/connect/authorize"); 


     var dic = new Dictionary<string, string>(); 
     dic.Add("client_id", "Xamarin"); 
     dic.Add("response_type", responseType); 
     dic.Add("scope", scope); 
     dic.Add("redirect_uri", "http://xx.xx.xx.xx/signin-oidc"); 
     dic.Add("nonce", Guid.NewGuid().ToString("N")); 


     _currentCSRFToken = Guid.NewGuid().ToString("N"); 
     dic.Add("state", _currentCSRFToken); 

     var authorizeUri = authorizeRequest.Create(dic); 
     webLogin.Source = authorizeUri; 
     webLogin.IsVisible = true; 
    } 

Я получаю сообщение об ошибке «unauthorized_client» в мобильном приложении, и в моих журналах в сервере показывает:

fail: IdentityServer4.Validation.AuthorizeRequestValidator[0] 
    Invalid grant type for client: implicit 
    { 
    "ClientId": "Xamarin", 
    "ClientName": "Xamarin Client", 
    "RedirectUri": "http://xx.xx.xx.xx/signin-oidc", 
    "AllowedRedirectUris": [ 
     "http://xx.xx.xx.xx/signin-oidc" 
    ], 
    "SubjectId": "anonymous", 
    "ResponseType": "token", 
    "ResponseMode": "fragment", 
    "GrantType": "implicit", 
    "RequestedScopes": "", 
    "State": "5c53c5e5bbe44c0f8c5d4b401df0938e", 
    "Raw": { 
     "client_id": "Xamarin", 
     "response_type": "token", 
     "scope": "api1", 
     "redirect_uri": "http://xx.xx.xx.xx/signin-oidc", 
     "nonce": "49f21e8873d744bea76f6f00ebae3eb4", 
     "state": "5c53c5e5bbe44c0f8c5d4b401df0938e" 
    } 
    } 
    fail: IdentityServer4.Endpoints.AuthorizeEndpoint[0] 
    Request validation failed 
    info: IdentityServer4.Endpoints.AuthorizeEndpoint[0] 
    { 
    "ClientId": "Xamarin", 
    "ClientName": "Xamarin Client", 
    "RedirectUri": "http://xx.xx.xx.xx/signin-oidc", 
    "AllowedRedirectUris": [ 
     "http://xx.xx.xx.xx/signin-oidc" 
    ], 
    "SubjectId": "anonymous", 
    "ResponseType": "token", 
    "ResponseMode": "fragment", 
    "GrantType": "implicit", 
    "RequestedScopes": "", 
    "State": "5c53c5e5bbe44c0f8c5d4b401df0938e", 
    "Raw": { 
     "client_id": "Xamarin", 
     "response_type": "token", 
     "scope": "api1", 
     "redirect_uri": "http://xx.xx.xx.xx/signin-oidc", 
     "nonce": "49f21e8873d744bea76f6f00ebae3eb4", 
     "state": "5c53c5e5bbe44c0f8c5d4b401df0938e" 
    } 
    } 

Но если проверить мой код, я не поток неявным для этот тип клиента. И я дважды проверил свою базу данных, чтобы убедиться, что это authorization_code. Я ценю, если кто-то поможет мне исправить это.

+0

Я понял, ошибка находится в responsetype, что я отправить от клиента. токен для неявного, код предназначен для потока кода авторизации. Но он не возвращает код доступа –

+0

https://leastprivilege.com/2016/01/17/which-openid-connectoauth-2-o-flow-is-the-right-one/ –

ответ

2

Это не выглядит, как будто idsrv4 поддерживает code, code token ни code id_token token как response_type на данный момент - только code id_token. По крайней мере, текущий демонстрационный сайт терпит неудачу при попытке протестировать клиента и запрос /authorize с использованием клиента server.code.

Единственный работающий клиент я нашел, связанные с кодом авторизации была с установкой Hybrid (code id_token/server.hybrid):

https://demo.identityserver.io/connect/authorize? 
    client_id=server.hybrid& 
    response_type=code id_token& 
    response_mode=fragment& 
    redirect_uri=https://notused& 
    scope=openid api& 
    state=1& 
    nonce=2 

Не уверен, почему это так, как это уже в списке supported_response_types в документе обнаружения , Может быть, Dominic/Брок может заполнить

"response_types_supported": [ 
    "code", 
    "token", 
    "id_token", 
    "id_token token", 
    "code id_token", 
    "code token", 
    "code id_token token" 
    ], 

Non запрос рабочего кода аутентификации потока (unsupported_response_type):.

https://demo.identityserver.io/connect/authorize? 
    client_id=server.code& 
    response_type=code& 
    response_mode=fragment& 
    redirect_uri=https://notused& 
    scope=openid api& 
    state=1& 
    nonce=2 
+0

Теперь я получаю сообщение об ошибке "client_id «отсутствует или слишком долго. Но я определенно подтвердил запрос, и у него есть client_id «xamarin» в нем –

+0

Когда вы пытаетесь установить клиента с гибридным потоком и используете «код id_token»? –

+0

Q2: Существует ли область видимости «api2» как ресурс в ваших ApiResources? –

Смежные вопросы