【发布时间】: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