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

时间:2011-06-14 13:32:06

标签: asp.net-mvc-3 azure x509 acs

我正在尝试将OpenID身份验证用于我的Azure ASP.NET MVC 3应用程序,并按照MVC 3 Custom Login Sample中的步骤执行此操作。一切都在开发环境中正常工作,但在部署到Azure平台时却没有。

第一个问题始于身份验证导致错误“密钥无法在指定状态下使用”discussion here表示应用程序需要配置为使用RsaEncryptionCookieTransform而不是默认的DPAPI。为了尝试解决这个问题,我添加了OnServiceConfigurationCreated描述on Alik Levin's blog的代码,但没有进一步说明,因为它描述了在开发中设置自签名证书(如上所述,没有必要) ,而不是Azure。

我尝试使用Azure中已有的X.509证书,而不是那种方法。我在Windows Azure Management>下找到了指纹;访问控制服务>依赖方应用> (我的申请名称)>令牌签名证书>用于服务命名空间(X.509证书)。然后我将此引用添加到web.config:

<serviceCertificate>
    <certificateReference x509FindType="FindByThumbprint" findValue="8A417..." />
</serviceCertificate>

现在我在应用程序启动时收到配置错误:

ID1024: The configuration property value is not valid.
Property name: 'certificateReference'
Error: 'ID1025: Cannot find a unique certificate that matches the criteria.
StoreName: 'My'
StoreLocation: 'LocalMachine'
X509FindType: 'FindByThumbprint'
FindValue: '8A417...''

我是否真的需要更改加密方法以解决“密钥无法在指定状态下使用”错误?如果是这样,我如何使用Azure中已有的X.509证书来加密cookie?

2 个答案:

答案 0 :(得分:4)

您所指的证书是ACS使用的令牌签名证书。您需要在Web角色中部署证书,以便WIF可以使用它来加密cookie(与令牌无关)。您必须在Windows Azure部署中添加证书。 (服务配置)。

参见http://claimsid.codeplex.com

中的示例#5

如果这是一个概念证明,并且您希望只运行所有默认值。看这里: http://msdn.microsoft.com/en-us/library/ff966484.aspx#sec3

您需要设置“加载用户个人资料=真”,以便DPAPI正常工作。 (这可能就是你在本地机器上的内容)。

答案 1 :(得分:1)

最终我(再次)找到了文章Securing Windows Azure Web Role ASP.NET Web Application Using Access Control Service v2.0。根据本文重新配置ACS管理门户的web.config和“依赖方应用程序”部分后,我能够使一切正常运行。具体来说,我只想要那些用RequireAuthentication修饰的控制器动作,如ACS 2.0示例for this tutorial所示,要求用户登录。现在可以使用。

唯一的缺点是整个应用程序必须在SSL中运行才能实现无缝的用户体验。否则,在HTTP中运行时,将提示用户进行身份验证,进行身份验证,然后将其转储回显然未经过身份验证的HTTP。但是,切换到SSL端点后,用户已经过身份验证!

在开发结构中,这是我想要的,Stack Overflow样式,我可以在标准HTTP中运行所有内容,而无需使用证书和身份验证通过SSL进行。但是,由于Azure中的RSA cookie要求并且需要证书,因此无法在云中使用。 (如果开发人员对这个和其他common gotchas发出警告,那将是很好的。)我希望在将来的某个时候重新审视这个问题。

总之,我建议您在尝试超出提供的示例之前了解Windows Identity Foundation以及它如何应用于Azure。在撰写本文时可获得的一些资源: