IdentityServer3: Owin Katana Marmware бросает ошибку «Invalid_Client», так как она не может получить токен -- asp.net-mvc поле с участием identityserver3 поле с участием openid-connect поле с участием katana поле с участием owin-middleware пол Связанный проблема

IdentityServer3: OWIN Katana middleware is throwing “invalid_client” error as it cannot get a token


0
vote

проблема

русский

Мы используем IdentityServer3 в качестве провайдера идентичности и промежуточное программное обеспечение Owin Katana, чтобы сделать рукопожатие на основе Connect OpenID. Аутентификация работает нормально, так как мы были перенаправлены на сервер идентификации и обратно на исходный веб-сайт. Но проблема Invalid_Client появляется, когда я пытаюсь получить токены и получить претензии в «OpenIDConnectauthenticationsifications».

Пожалуйста, проверьте код (класс запуска) ниже и прикрепленный скриншот.

 <код> public sealed class Startup {        public void Configuration(IAppBuilder app)     {         string ClientUri = @"https://client.local";         string IdServBaseUri = @"https://idm.website.com/core";l         string TokenEndpoint = @"https://idm.website.com/core/connect/token";         string UserInfoEndpoint = @"https://idm.website.com/core/connect/userinfo";         string ClientId = @"WebPortalDemo";         string ClientSecret = @"aG90apW2+DbX1wVnwwLD+eu17g3vPRIg7p1OnzT14TE=";          //AntiForgeryConfig.UniqueClaimTypeIdentifier = "sub";         JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();          app.UseCookieAuthentication(new CookieAuthenticationOptions         {             AuthenticationType = "Cookies"         });          app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions         {             ClientId = ClientId,             Authority = IdServBaseUri,             RedirectUri = ClientUri,             PostLogoutRedirectUri = ClientUri,             ResponseType = "code id_token token",             Scope = "openid profile roles",             TokenValidationParameters = new TokenValidationParameters             {                 NameClaimType = "name",                 RoleClaimType = "role"             },             SignInAsAuthenticationType = "Cookies",              Notifications = new OpenIdConnectAuthenticationNotifications             {                 AuthorizationCodeReceived = async n =>                 {                     // use the code to get the access and refresh token                     var tokenClient = new TokenClient(                         TokenEndpoint,                         ClientId,                         ClientSecret);                      var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);                      if (tokenResponse.IsError)                     {                         throw new Exception(tokenResponse.Error);                     }                      // use the access token to retrieve claims from userinfo                     var userInfoClient = new UserInfoClient(UserInfoEndpoint);                      var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);                      // create new identity                     var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);                     //id.AddClaims(userInfoResponse.GetClaimsIdentity().Claims);                     id.AddClaims(userInfoResponse.Claims);                      id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));                     id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString()));                     id.AddClaim(new Claim("refresh_token", tokenResponse.RefreshToken));                     id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));                     id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value));                      n.AuthenticationTicket = new AuthenticationTicket(                         new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"),                         n.AuthenticationTicket.Properties);                 },                  RedirectToIdentityProvider = n =>                 {                     // if signing out, add the id_token_hint                     if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)                     {                         var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");                          if (idTokenHint != null)                         {                             n.ProtocolMessage.IdTokenHint = idTokenHint.Value;                         }                      }                      return Task.FromResult(0);                 }             }          });     } }   

Введите описание изображения здесь

Конфигурация клиента на IDSVR3 была указана для использования гибридного потока, и я проверил, что идентификатор клиента и секрет клиента много раз, чтобы убедиться, что они верны.

Вот конфигурация клиента на стороне сервера:

Введите описание изображения здесь

Английский оригинал

We are using IdentityServer3 as the identity provider and OWIN Katana middleware to do the handshake based on OpenId Connect. The authentication works fine as we were redirected to identity server and back to the originating website. But the issue of invalid_client appears when I try to retrieve the tokens and get claims in the "OpenIdConnectAuthenticationNotifications".

Please check the code (startup class) below and the attached screenshot.

public sealed class Startup {        public void Configuration(IAppBuilder app)     {         string ClientUri = @"https://client.local";         string IdServBaseUri = @"https://idm.website.com/core";l         string TokenEndpoint = @"https://idm.website.com/core/connect/token";         string UserInfoEndpoint = @"https://idm.website.com/core/connect/userinfo";         string ClientId = @"WebPortalDemo";         string ClientSecret = @"aG90apW2+DbX1wVnwwLD+eu17g3vPRIg7p1OnzT14TE=";          //AntiForgeryConfig.UniqueClaimTypeIdentifier = "sub";         JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();          app.UseCookieAuthentication(new CookieAuthenticationOptions         {             AuthenticationType = "Cookies"         });          app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions         {             ClientId = ClientId,             Authority = IdServBaseUri,             RedirectUri = ClientUri,             PostLogoutRedirectUri = ClientUri,             ResponseType = "code id_token token",             Scope = "openid profile roles",             TokenValidationParameters = new TokenValidationParameters             {                 NameClaimType = "name",                 RoleClaimType = "role"             },             SignInAsAuthenticationType = "Cookies",              Notifications = new OpenIdConnectAuthenticationNotifications             {                 AuthorizationCodeReceived = async n =>                 {                     // use the code to get the access and refresh token                     var tokenClient = new TokenClient(                         TokenEndpoint,                         ClientId,                         ClientSecret);                      var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);                      if (tokenResponse.IsError)                     {                         throw new Exception(tokenResponse.Error);                     }                      // use the access token to retrieve claims from userinfo                     var userInfoClient = new UserInfoClient(UserInfoEndpoint);                      var userInfoResponse = await userInfoClient.GetAsync(tokenResponse.AccessToken);                      // create new identity                     var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType);                     //id.AddClaims(userInfoResponse.GetClaimsIdentity().Claims);                     id.AddClaims(userInfoResponse.Claims);                      id.AddClaim(new Claim("access_token", tokenResponse.AccessToken));                     id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString()));                     id.AddClaim(new Claim("refresh_token", tokenResponse.RefreshToken));                     id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));                     id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value));                      n.AuthenticationTicket = new AuthenticationTicket(                         new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"),                         n.AuthenticationTicket.Properties);                 },                  RedirectToIdentityProvider = n =>                 {                     // if signing out, add the id_token_hint                     if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)                     {                         var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");                          if (idTokenHint != null)                         {                             n.ProtocolMessage.IdTokenHint = idTokenHint.Value;                         }                      }                      return Task.FromResult(0);                 }             }          });     } } 

enter image description here

The client configuration at the IdSvr3 has been specified to use Hybrid Flow and I have checked that the client Id and client secret many times to verify that they are correct.

Here is the client configuration at the server side:

enter image description here

</div
              
   
   

Список ответов

0
 
vote
vote
Лучший ответ
 

Я смог решить проблему, глядя на журналы, генерируемые сервером Identity. Журналы заявили, что секрет клиента неверен, когда я несколько раз проверил, что секрет был точным для того, что показать на сервере идентичности. Но тогда я понял, что секрет должен быть фактическим текстом, а не хешированным. Модифицированный код, который работал ниже:

 <код> string ClientId = @"WebPortalDemo"; //string ClientSecret = @"aG90apW2+DbX1wVnwwLD+eu17g3vPRIg7p1OnzT14TE="; // Incorrect secret, didn't work string ClientSecret = @"love"; // Actual text entered as secret, worked   

Кредит: @rawel

 

I was able to resolve the issue by looking at the logs generated by identity server. The logs said the client secret is incorrect, when I have checked several times that the secret was exact to what was showing on the identity server. But then I realised that the secret should be the actual text and NOT the hashed one. The modified code that worked is below:

string ClientId = @"WebPortalDemo"; //string ClientSecret = @"aG90apW2+DbX1wVnwwLD+eu17g3vPRIg7p1OnzT14TE="; // Incorrect secret, didn't work string ClientSecret = @"love"; // Actual text entered as secret, worked 

Credit: @rawel

</div
 
 

Связанный проблема

7  ModelState не проверяет вложенные модели после редактирования в контроллере  ( Modelstate not validating nested models after editing in controller ) 
Я вложил просмотра модерников, как эти два: <код> public class FirstViewModel { public SecondViewModel SecondViewModel { get; set; } } public class Sec...

2  Asp.net с mvc model model в одном представлении (создание, обновление)  ( Asp net with mvc multiple model in one view create update ) 
У меня проблемы в ASP.NE MVC с несколькими моделью в одном представлении на создании и обновлении Я работаю на экзаменной системе Вопросы класса и ответы клас...

0  Сохранение файла в папке  ( Saving file in a folder ) 
В моем приложении MVC я позволяю пользователям создать новый файл PDF, используя редактор. Я хочу сохранить созданный файл в папке, как я могу сделать это? Эт...

39  Где я должен делать инъекцию с Ninject 2+ (а как я могу организовать мои модули?)  ( Where should i do injection with ninject 2 and how do i arrange my modules ) 
У меня есть решение с двумя актуальными (к этому вопросу) проекты и несколько других; Класс библиотека с функциональностью, используемой несколькими другим...

0  Обновить OutputsCache на Expire C # MVC  ( Refresh outputcache on expire c sharp mvc ) 
Я создаю веб-приложение, которое запрашивает базу данных и получает данные из него. Мне нужно использовать <код> OutputCaching , чтобы кэшировать данные, полу...

3  XVal и шаблон ViewModel - можно ли сделать?  ( Xval and the viewmodel pattern can it be done ) 
Я добавил XVal в приложение Nerddinner - пока так хорошо, я получаю проверку на стороне клиента с jQuery.validate в одной строке, которая действительно красив...

3  Удалить элемент от JsonResult в C #  ( Remove an element from jsonresult in c sharp ) 
У меня есть <код> JsonResult объект для возврата из метода MVC, но мне нужно удалить один элемент от него перед отправкой. <Сильное> Обновление: Я пытаюс...

0  Передать коллекцию значений к действию, динамически созданные текстовые ящики  ( Pass a collection of values to action dynamically created textboxes ) 
Я создаю текстовые коробки динамически с jQuery. Что мне интересно, как я могу отправить эти ценности в мои действия сейчас с моим просмотром Model, вроде это...

0  Как получить имя страницы вентилятора Facebook в моем приложении в Tab Facebook  ( How to get facebook fan page name in my facebook tab application ) 
Я создал приложение Tab Facebook, которое позволяет Admin Page Facebook FancoS добавить его в качестве вкладки на их вентилятор. До сих пор все хорошо работае...

0  Как я могу изменить текст кнопки на странице нагрузки  ( How can i change the button text on page load ) 
Я хочу изменить текст кнопки на нагрузке страницы. Я использую статические данные, и моя кнопка не отображается. <Сильная> Модель <код> CREATE TABLE [dbo...

0  ASP.NET MVC 5 Identity - «Имя пользователя уже существует» при использовании пользовательского пользователей  ( Asp net mvc 5 identity a user name already exists when using custom user ) 
Я использую ASP.NET MVC 5, чтобы создать веб-приложение. Для целей моего приложения я создал SEPRATE « пользователь сайта » класс, который выглядит так: <...

67  Отображение изображения из базы данных в ASP MVC  ( Display image from database in asp mvc ) 
Я получаю изображение в байтовом формате массива из контроллера, как я могу отобразить это в виду? в простом смысле. ...

0  Как ASP.NET MVC создает экземпляры контроллера  ( How does asp net mvc create controller instances ) 
Как ASP.NET MVC создает экземпляры контроллера для запроса? Создает ли он разные экземпляры для разных запросов? Если это так, значит ли это ViewBag не может ...

0  Как доступом доступа веб-проекта MVC в другой проект MVC API  ( How a mvc web project backend access to another mvc api project ) 
Есть буксир ASP.NET MVC Projects.one IS MVC API, а другой - MVC Web. MVC API с использованием OWIN для AUTH2. И веб-доступ MVC доступа к API, а не JS. Проблем...

0  Google STASS TOOCOLPOLETE не работает после частичной нагрузки страницы в ASP.NET MVC  ( Google places autocomplete not working after a partial page load in asp net mvc ) 
Я загружаю частичную страницу с адресной формой с помощью jQuery .Load (). Это работает и открывает модальное окно, содержащееся на частичной странице. Тогд...

Связанный проблема

7  ModelState не проверяет вложенные модели после редактирования в контроллере 
2  Asp.net с mvc model model в одном представлении (создание, обновление) 
0  Сохранение файла в папке 
39  Где я должен делать инъекцию с Ninject 2+ (а как я могу организовать мои модули?) 
0  Обновить OutputsCache на Expire C # MVC 
3  XVal и шаблон ViewModel - можно ли сделать? 
3  Удалить элемент от JsonResult в C # 
0  Передать коллекцию значений к действию, динамически созданные текстовые ящики 
0  Как получить имя страницы вентилятора Facebook в моем приложении в Tab Facebook 
0  Как я могу изменить текст кнопки на странице нагрузки 
0  ASP.NET MVC 5 Identity - «Имя пользователя уже существует» при использовании пользовательского пользователей 
67  Отображение изображения из базы данных в ASP MVC 
0  Как ASP.NET MVC создает экземпляры контроллера 
0  Как доступом доступа веб-проекта MVC в другой проект MVC API 
0  Google STASS TOOCOLPOLETE не работает после частичной нагрузки страницы в ASP.NET MVC