使用Azure ACS时如何解决“密钥在指定状态下无效”错误?

| 我正在尝试使OpenID身份验证在我的Azure ASP.NET MVC 3应用程序中工作,并且已按照MVC 3自定义登录示例中的步骤进行操作。一切在开发环境中均能正常工作,但在部署到Azure平台时则无法正常工作。 第一个问题从身份验证开始,导致错误“密钥在指定状态下无效”。此处的讨论指出,需要将应用程序配置为使用RsaEncryptionCookieTransform而不是默认的DPAPI。为了解决这个问题,我添加了Alik Levin博客中描述的
OnServiceConfigurationCreated
代码,但由于描述了在开发中设置自签名证书的必要性,因此不再赘述(如上所述,这不是必需的) ,不在Azure中。 代替该方法,我尝试使用Azure中已经存在的X.509证书。我在Windows Azure管理>访问控制服务>依赖方应用程序>(我的应用程序名称)>令牌签名证书>用于服务命名空间(X.509证书)下找到了指纹。然后,我将此引用添加到web.config中:
<serviceCertificate>
    <certificateReference x509FindType=\"FindByThumbprint\" findValue=\"8A417...\" />
</serviceCertificate>
现在,我在应用程序启动时收到配置错误: ID1024:配置属性值无效。 属性名称:\'certificateReference \' 错误:\'ID1025:找不到符合条件的唯一证书。 店铺名称:\'我的\' 店铺位置:\'LocalMachine \' X509FindType:\'FindByThumbprint \' FindValue:\'8A417 ... \'\' 我是否真的需要更改加密方法来解决“密钥在指定状态下无效”错误?如果是这样,如何使用Azure中已经存在的X.509证书来加密cookie?     
已邀请:
        您所指的证书是ACS使用的令牌签名证书。您需要在您的Web角色中部署一个证书,以便WIF可以使用它来加密cookie(与令牌无关)。您将必须在Windows Azure部署中添加证书。 (服务配置)。 请参阅http://claimsid.codeplex.com中的示例5。 如果这是概念证明,而您只想使用所有默认值运行。看这里: http://msdn.microsoft.com/zh-CN/library/ff966484.aspx#sec3 您需要设置\“ Load User Profile = true \”,这样DPAPI才能工作。 (这可能是您在本地计算机上拥有的)。     
        最终,我(再次)发现了使用访问控制服务v2.0保护Windows Azure Web角色ASP.NET Web应用程序安全的文章。根据本文重新配置了web.config和ACS管理门户的“依赖方应用程序”部分之后,我就能使所有工作正常进行。具体来说,我只希望那些装饰有
RequireAuthentication
的控制器操作(如本教程的ACS 2.0示例中所示)要求用户登录。 唯一的缺点是,整个应用程序必须在SSL中运行,以确保无缝的用户体验。否则,当用户在HTTP中运行,经过身份验证后,会提示用户进行身份验证,然后转回显然未经身份验证的HTTP。但是,切换到SSL端点后,用户已通过身份验证! 在开发结构中,它可以按我希望的那样工作,即Stack Overflow样式,在该样式中,我可以使用标准HTTP运行所有内容,而无需使用证书,并且身份验证通过SSL进行。但是,由于Azure中需要RSA cookie,并且需要证书,因此无法在云中运行。 (如果dev fabric警告有关此问题和其他常见问题,那将是很棒的。)我希望在将来的某个时候重新讨论这一问题。 总而言之,我建议您在尝试提供的示例之外的任何内容之前,先了解Windows Identity Foundation及其如何应用于Azure。在撰写本文时,一些可用资源: TechNet Wiki for Azure(特别是有关ACS和WIF的文章) ClaimsID(CodePlex) ACS(CodePlex) 编程Windows Identity Foundation(本书)     

要回复问题请先登录注册