При попытке десериализации токенов SAML можно ли прочитать сертификат SSL из файла вместо хранилища сертификатов? - PullRequest
0 голосов
/ 28 марта 2011

Я бы хотел что-то вроде этого:

<microsoft.identityModel>
    <service>
      <serviceCertificate>
        <certificateReference filename="App_Data/my.domain.com.crt" />
      </serviceCertificate>
    </service>
</microsoft.identityModel>

Ответы [ 3 ]

1 голос
/ 28 марта 2011

Вы можете, но, как предполагает Бобби, вам лучше, если сертификат установлен в магазине mahcine. Фактически это был обходной путь при развертывании приложений с использованием WIF в Windows Azure, когда он не поддерживал обновление сертификатов. Это ограничение давно прошло.

1 голос
/ 28 марта 2011

Согласно документации , нет. Чтобы расшифровать токен SAML, WIF необходим доступ к закрытому ключу сертификата. Размещение сертификата и его закрытого ключа в файловой системе (особенно в папке, управляемой IIS - независимо от предлагаемой защиты) - это, как правило, плохая идея. Поместив сертификат в хранилище сертификатов, вы сможете намного более жестко контролировать и управлять доступом к сертификату.

0 голосов
/ 28 марта 2011

Я понял это.Закомментируйте эту часть в web.config

  <!--<serviceCertificate>
    <certificateReference x509FindType="FindByThumbprint" findValue="" storeLocation="LocalMachine" storeName="My" />
  </serviceCertificate>-->

Добавьте этот код в global.asax

    protected void Application_Start()
    {
        Microsoft.IdentityModel.Web.FederatedAuthentication.ServiceConfigurationCreated += new EventHandler
            <Microsoft.IdentityModel.Web.Configuration.ServiceConfigurationCreatedEventArgs>(AttachCert);
    }

    protected void AttachCert(object sender, Microsoft.IdentityModel.Web.Configuration.ServiceConfigurationCreatedEventArgs e)
    {
        var filename = string.Format("{0}\\{1}\\{2}", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, "App_Data\\certificates", "CERTNAME.pfx");
        var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(filename, "YOURPASSWORD");

        var _configuration = e.ServiceConfiguration;
        _configuration.ServiceCertificate = cert;

        var certificates = new List<System.IdentityModel.Tokens.SecurityToken> { new System.IdentityModel.Tokens.X509SecurityToken(
                _configuration.ServiceCertificate) };

        var encryptedSecurityTokenHandler =
                (from handler in _configuration.SecurityTokenHandlers
                 where handler is Microsoft.IdentityModel.Tokens.EncryptedSecurityTokenHandler
                 select handler).First() as Microsoft.IdentityModel.Tokens.EncryptedSecurityTokenHandler;

        _configuration.ServiceTokenResolver = encryptedSecurityTokenHandler.Configuration.ServiceTokenResolver =
                System.IdentityModel.Selectors.SecurityTokenResolver.CreateDefaultSecurityTokenResolver(certificates.AsReadOnly(), false);
    }
...