我正在尝试在共享主机上运行WIF依赖方应用程序。他们不会将IIS设置LoadUserProfile设置为true,因此出现以下错误:
有没有办法解决?
最佳答案
是的,这是因为您使用的是依赖于DPAPI的默认 token 加密。您可以将其替换为基于证书的加密。参见此处:http://msdn.microsoft.com/en-us/library/ff803371.aspx(滚动至“应用程序还有另一项更改...”)
代码是:
void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e)
{
var sessionTransforms =
new List<CookieTransform>(
new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(
e.ServiceConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(
e.ServiceConfiguration.ServiceCertificate)
});
var readOnlyTransforms = sessionTransforms.AsReadOnly();
var sessionHandler = new SessionSecurityTokenHandler(readOnlyTransforms);
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);
}
和
void Application_Start(object sender, EventArgs e)
{
FederatedAuthentication.ServiceConfigurationCreated += OnServiceConfigurationCreated;
}
两者都在global.asax.cs上
顺便说一句,这也是配置WIF的“Web农场友好”方式,因此它与机器(实例)无关。 Windows Azure部署本质上是Web场,因此这就是在本章中看到它的原因。
更新:在较新的版本中,API已更改。更新后的代码如下所示
void OnFederationConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
{
var sessionTransforms = new List<CookieTransform>(
new CookieTransform[]
{
new DeflateCookieTransform(),
new RsaEncryptionCookieTransform(e.FederationConfiguration.ServiceCertificate),
new RsaSignatureCookieTransform(e.FederationConfiguration.ServiceCertificate)
});
var sessionHandler = new SessionSecurityTokenHandler(sessionTransforms.AsReadOnly());
e.FederationConfiguration
.IdentityConfiguration
.SecurityTokenHandlers
.AddOrReplace(sessionHandler);
}
和
protected void Application_Start()
{
FederatedAuthentication.FederationConfigurationCreated += OnFederationConfigurationCreated;
}
关于iis-7 - 是否可以在没有LoadUserProfile = True的情况下运行WIF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5464146/