【问题标题】:How to solve "Key not valid for use in specified state" error when using Azure ACS?使用 Azure ACS 时如何解决“Key not valid for use in specified state”错误?
【发布时间】:2011-06-14 13:32:06
【问题描述】:

我正在尝试让 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 管理 > 访问控制服务 > 依赖方应用程序 >(我的应用程序名称)> 令牌签名证书 > 用于服务命名空间(X.509 证书)下找到了指纹。然后我将此引用添加到 web.config:

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

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

ID1024:配置属性值无效。 属性名称:'certificateReference' 错误:'ID1025:找不到符合条件的唯一证书。 店铺名称:'我的' 存储位置:'LocalMachine' X509FindType: 'FindByThumbprint' FindValue: '8A417...''

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

【问题讨论】:

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


    【解决方案1】:

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

    参见http://claimsid.codeplex.com 中的示例 #5

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

    您需要设置“加载用户配置文件=true”,这样 DPAPI 才能工作。 (这可能是您在本地计算机中的内容)。

    【讨论】:

    • 查看示例并阅读此 Codeplex 站点上的更多文档后,我现在对此有了更多了解。我创建并上传了证书using these instructions。我不再有错误,只是登录链接在 Azure 平台上没有任何作用。
    • 很高兴听到它很有用。您是否在本地 Azure 模拟器中运行? (您可能应该在部署到云之前从那里开始)登录链接指向哪里?
    • 我在本地模拟器中运行的所有东西都没有证书或任何问题,只是在部署到 Azure 时我遇到了所有这些麻烦!我这样做是为了证明概念,所以可能没有时间了,但我会尝试重新审视并让这部分工作。
    【解决方案2】:

    最终我(再次)找到了文章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 端点后,用户已通过身份验证!

    在开发结构中,这按我的意愿工作,堆栈溢出风格,我能够在标准 HTTP 中运行所有内容,而无需使用证书,并且通过 SSL 进行身份验证。但是,由于 Azure 中的 RSA cookie 要求和证书的需要,这在云中不起作用。 (如果 dev fabric 对这个和其他 common gotchas 发出警告,那就太好了。)我希望在未来的某个时候重新审视这个。

    总之,我建议您先了解 Windows Identity Foundation 以及它如何应用于 Azure,然后再尝试提供的示例之外的任何内容。在撰写本文时可用的一些资源:

    【讨论】:

    • 我遇到了与您相同的问题,我按照您发布的指南进行操作,但有一个问题要问您。每次在 Visual Studio 中运行项目时是否都重定向到访问控制。如果是这样,您是如何解决的?您的网站访问者是否每次都被重定向到该领域,还是仅在开发环境中。
    • @Bombcode 很久以前我记不住细节了,抱歉。但是我记得 ACS 的行为是不同的,这取决于我是在开发平台上运行还是在 Azure 平台上运行。
    • 好的,谢谢 Alex 经过进一步调试后我发现了问题。我拒绝了所有用户。我现在已允许所有用户并已屏蔽该网站的某些区域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多