【问题标题】:Reading cookie value : Using URL Rewrite Provider module - Unable to validate at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData读取 cookie 值:使用 URL 重写提供程序模块 - 无法在 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData 验证
【发布时间】:2015-12-29 07:34:00
【问题描述】:

我需要使用 URL 重写模块将 USERNAME 附加到服务器端的 URL。

为什么?: 我有网站 site1,当 USER 登录到 site1 时,他会看到一个指向 site2. 的链接。这个链接是 URL 或报告。 (画面)。 已在 site1 中使用 FormAuthentication 创建了经过身份验证的票证。 当USER点击链接时,经过身份验证的username应该被传递给site2。

我可以从客户端附加用户名,但由于安全问题,我必须在执行之前将用户名附加到服务器端的 URL。

所以我决定使用 URL 重写提供程序,它通过解密 cookie 值来获取 用户名,如下所示

     namespace PlatformAnalysisUrlProvider.PlatformAnalysisProvider
      {
       class AnalysisRewriteProvider: IRewriteProvider, IProviderDescriptor
       {
          public void Initialize(IDictionary<string, string> settings,
                                 IRewriteContext rewriteContext)
          {

          }

          public string Rewrite(string value)
          {
             string[] cookievalues = value.Spli('=');
             FormAuthentication ticket = FormAuthentication.Decrypt(cookievalues[1]);

              //Decrypt throws error as shown below
          } 
       }
      }

Cookie 值

        cookievalues [0] =  has the key

        cookievalues [1] =  has the value 

例子:

        233AWJDKSHFHFDSHFJKDFDKJFHDKJFKDJFHDHFDHFKJHDFKJHDFJHDKJFHDSKJFHDF

这是一个 cookie 值。但解密没有发生

我收到以下错误

        Unable to validate data.
        at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(
        Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, 
        Int32 length, IVType ivType, Boolean useValidationSymAlgo, 
        Boolean signData)

这是我在 IIS 中的 URL 重写设置

  • 请求的 URL:匹配模式
  • 使用:正则表达式
  • 忽略大小写 - 选中
  • 条件 - 输入:{HTTP_COOKIE} 类型:匹配模式 模式:.*
  • 动作类型 - 重写
  • 重写 URL - http://11.155.011.123{HTTP_URL}&USERNAME={PlatformAnalysisUrlProvider:{C:0}}

I have also set up MACHINE KEY as suggested by this forum

I have referred this post for development

其中一个堆栈溢出帖子表明它可能是防火墙或防病毒问题。但我没有安装防病毒软件或启用防火墙。

如果有人将我引导到使用 IIS 和 URL 重写提供程序托管的网站的 代码示例,这真的很有帮助。

更新错误日志

MODULE_SET_RESPONSE_ERROR_STATUS 通知 - “PRE_BEGIN_REQUEST” HttpReason - “URL 重写模块错误”

使用机器密钥信息更新帖子

     <MachineKey Description="AES" validation="SHA1"
      descriptionKey="******"
      validationKey="******" CompatibilityMode="Framework20SP2">

原因可能是 - 创建 cookie 的网站是使用 .NET Framework 4.5 开发的。我们读取 cookie 的提供者是 Framework 3.5。这可能是原因吗?或者我们需要 Provider 项目的配置文件吗?

更新 - 我已将机器密钥添加到 Machine.config 中,但仍然无法正常工作:(

替代解决方案

  • 将 App.config 添加到类库

     <?xml version="1.0" encoding="utf-8" ?>
     <configuration>
     <appSettings>
     <!-- ... -->
        <add key="SecurityKey" value="somevalue"/>
     <!-- ... -->
     </appSettings>
     </configuration>
    
  • 将配置复制到 GAC 关注此博客 - http://techphile.blogspot.in/2007/02/2.html

  • 加密值 (refer here) 并在登录期间创建自定义 cookie

  • 在自定义重写提供程序中使用解密逻辑

【问题讨论】:

  • 我认为您正试图在两个不同的网站之间以不受支持的方式使用网站内加密方法。考虑将 Website1 功能作为外观,像现在一样提供身份验证功能。然后可以将该网站上包含有效令牌的请求代理转发到 Website2。 Website1 可以解密身份验证所需的信息,然后在将请求转发到 Website2 之前,将在 Website2 上进行身份验证所需的任何信息插入请求标头中。如果该信息必须加密,请自行加密...
  • ...(不使用 FormAuthentication 对象)以您可以在 Website2 解密的方式。
  • 我已经更新了帖子

标签: c# iis cookies url-rewriting


【解决方案1】:

这样做的好处是该错误是一般的解密错误,而不是 URL 重写本身的错误,因此可以为您提供更广泛的搜索帮助区域。 URL 重写的机制似乎是正确的。

解密意味着必须使用与解密相同的方法对其进行加密。所以它必须是正确的cookie和正确的解密方法。

由于您没有检查正在读取的 cookie,因此如果错误的 cookie 在 cookie 列表中排在第一位,您可能会得到意想不到的结果。

以下是我推荐的一些解决此问题的步骤:

  • 创建一个简单的 URL 重写规则,该规则将为您提供 cookie 的值。我在下面的示例中创建了一个规则来做到这一点。您可以访问 yoursite.com/getcookie 对其进行测试。它应该重定向到 yoursite.com/?Cookie={cookievalue}
  • 然后您可以在 URL 重写提供程序之外测试您的代码。您可以创建一个简单的控制台应用或 winforms 应用来测试其余代码。
  • 我建议添加对 cookie 存在的检查,然后再次检查第二个值。例如:if (cookievalues[1] != null)
  • 在开发解密方法时,不必担心URL Rewrite。只要它在 .NET 中的测试应用中运行,您就应该做好准备。

<rule name="Get cookie value" stopProcessing="true">
    <match url="^getcookie" />
    <action type="Redirect" url="/?Cookie={HTTP_COOKIE}" appendQueryString="false" redirectType="Found" />
</rule>

【讨论】:

  • 感谢 scott 的步骤,我无法在 Visual Studio 中调试 Provider 代码,断点未命中。您能否提供开发提供程序和调试信息的最佳实践,以便我检查 COOKIE 值是否通过。
  • 我观察到的一件事:我的提供程序代码在 .net 框架版本 2.0 中,如果我将其更改为 4.5,IIS 提供程序配置屏幕中的“托管类型”下拉菜单将不会显示值
  • 嗨@Deepak。要使用 Visual Studio 进行调试,您可以编译和部署,然后手动将调试器附加到 IIS w3wp.exe 工作进程。这应该让你知道在 VS 中捕获它。否则,您可以创建一个仅用于解密的独立应用程序并单独调试它。一个简单的测试应用可能更容易调试。
猜你喜欢
  • 2014-07-17
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
相关资源
最近更新 更多