Настройка ASP.NET MVC 4 для работы с ACS Azure и новой библиотекой Microsoft System.IdentityModel.Tokens.Jwt

Как интегрировать версию 1.0.0 новой библиотеки обработчиков JWT (System.IdentityModel.Tokens.Jwt) в приложение ASP.NET MVC 4 для обработки токена JWT Azure из ACS?

Когда я пытаюсь запустить приложение, я получаю следующую ошибку:

[SecurityTokenValidationException: Jwt10329: не удалось проверить подпись, Configuration.IssuerTokenResolver.ResolveToken вернул значение null. jwt.Header.SigningKeyIdentifier: 'SecurityKeyIdentifier (IsReadOnly = false, Count = 2, Clause [0] = X509ThumbprintKeyIdentifierClause (Hash = 0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) .JwtSecurityTokenHandler.ValidateSignature (JwtSecurityToken jwt) +1275
System.IdentityModel.Tokens.JwtSecurityTokenHandler.ValidateToken (JwtSecurityToken jwt) +113
System.IdentityToken .IdentityModel.Tokens.SecurityTokenHandlerCollection.ValidateToken (токен SecurityToken) +73
System.IdentityModel.Services.TokenReceiver.AuthenticateToken (токен SecurityToken, логическое значениеsecurityBearerToken. (Запрос HttpRequestBase) +493
System.IdentityMode l.Services.WSFederationAuthenticationModule.OnAuthenticateRequest (отправитель объекта, аргументы EventArgs) +364
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +136 System.Web.SyncEventExecutionStep.Execute () завершено синхронно) +69

Мой web.config настроен как таковой:

<system.identityModel>

    <identityConfiguration>
      <audienceUris>
        <add value="http://127.0.0.1:81/" />
      </audienceUris>

      <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <trustedIssuers>
                  <add thumbprint="PRIVATEKEY"
                     name="https://CUSTOM.accesscontrol.windows.net/" />
        </trustedIssuers>
      </issuerNameRegistry>

      <securityTokenHandlers>
        <add type="System.IdentityModel.Tokens.JwtSecurityTokenHandler, System.IdentityModel.Tokens.Jwt" />
        <securityTokenHandlerConfiguration>
          <certificateValidation certificateValidationMode="PeerTrust" />
        </securityTokenHandlerConfiguration>
        <add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </securityTokenHandlers>

    </identityConfiguration>

  </system.identityModel>

  <system.identityModel.services>
    <federationConfiguration>
      <cookieHandler requireSsl="false" />
      <wsFederation passiveRedirectEnabled="false" issuer="https://staging.accesscontrol.windows.net/v2/wsfederation" realm="http://127.0.0.1:81/" requireHttps="false" />
    </federationConfiguration>

  </system.identityModel.services>

Я настроил Azure ACS для возврата токена JWT и установил правильную миниатюру безопасности в файле web.config, но не понимаю, почему возникает эта ошибка. Есть идеи?


person Sunshine Attack    schedule 12.06.2013    source источник


Ответы (2)


Я столкнулся с той же проблемой. С JWT веб-приложению необходимо что-то знать об эмитенте, чтобы проверить токен. Сертификат X509 отсутствует в JWT и должен быть доступен в хранилище сертификатов. Витторио Б. описывает проблему и шаги по ее устранению здесь в разделе« Использование обработчика JWT в приложениях WIF ».

person Doug Mitchell    schedule 12.06.2013

Мне удалось решить проблему, создав новый сертификат x.509 и загрузив его в Azure ACS в качестве основного сертификата X.509, а затем установив его в хранилище учетных данных на моем локальном компьютере.

Я выполнил эти инструкции, чтобы создать сертификат:

http://blogs.msdn.com/b/cclayton/archive/2012/03/21/windows-azure-and-x509-certificates.aspx.

Я использовал команду makecert для создания сертификата (не забудьте добавить свое собственное пространство имен)

makecert.exe -r -pe -a sha1 -n "CN=YOURNAMESPACE.accesscontrol.windows.net" -ss My -sr CurrentUser -len 2048 -sky exchange -sy 24

Затем я экспортировал сертификат как файл PFX, так и файл CER, используя certmgr.mcs.

Я импортировал файл PFX в свой Azure ACS (с помощью портала управления). Как только это было завершено, я скопировал новый эскиз и вставил его поверх старого значения в моем файле web.config.

Наконец, я установил файл CER в свое хранилище сертификатов, как описано в этом сообщении в блоге:

http://www.cloudidentity.com/blog/2012/11/20/introduction-the-developer-preview-of-the-json-web-token-handler-for-the-microsoft-net-framework-4-5-2/

Интересующий текст в приведенном выше сообщении блога - это следующий текст:

.CER. Дважды щелкните файл, нажмите кнопку «Установить сертификат…», выберите «Локальный компьютер», «Доверенные люди», и вы в деле.

Теперь все работает. Надеюсь, это сработает и для вас. ЕСЛИ вам нужна дополнительная помощь, просто спросите, и я постараюсь указать вам в правильном направлении

person Sunshine Attack    schedule 13.02.2014