根据主题,我将Owin.Security.WsFederation
和依赖包更新到4.0版,但出现错误。
除了更改之外,我没有进行任何代码更改
using Microsoft.IdentityModel.Protocols;
自
using Microsoft.IdentityModel.Protocols.WsFederation;
WsFederationConfiguration
类现在似乎在哪里。
这是我的启动身份验证:
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(
new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType
});
// Create WsFed configuration from web.config wsfed: values
var wsconfig = new WsFederationConfiguration()
{
Issuer = ConfigurationManager.AppSettings["wsfed:Issuer"],
TokenEndpoint = ConfigurationManager.AppSettings["wsfed:TokenEndPoint"],
};
/*
* Add x509 certificates to configuration
*
*/
// certificate.1 must always exist
byte[] x509Certificate;
x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.1"]);
wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
// certificate 2 may exist
if (ConfigurationManager.AppSettings["wsfed:certificate.2"] != null)
{
x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.2"]);
wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
}
// certificate 3 may exist
if (ConfigurationManager.AppSettings["wsfed:certificate.3"] != null)
{
x509Certificate = Convert.FromBase64String(ConfigurationManager.AppSettings["wsfed:certificate.3"]);
wsconfig.SigningKeys.Add(new X509SecurityKey(new X509Certificate2(x509Certificate)));
}
// Apply configuration to wsfed Auth Options
var wsoptions = new WsFederationAuthenticationOptions
{
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
Configuration = wsconfig,
Wreply = ConfigurationManager.AppSettings["wsfed:Wreply"],
Wtrealm = ConfigurationManager.AppSettings["wsfed:Wtrealm"],
};
wsoptions.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
// Add WdFederation middleware to Owin pipeline
app.UseWsFederationAuthentication(wsoptions);
}
4.0 还需要验证签名吗?我假设它正在谈论发行人的令牌签名。我没有看到如何启用 ShowPII 以查看它正在查看的密钥。
我正在使用带有完整框架的 MVC5。不是核心。
更新:
我尝试修改代码以使用身份提供程序在属性文件中提供的元数据来创建WsFederationConfiguration
但仍然收到相同的错误。我不确定签名是什么,或者如果它不在 idp 元数据中,我从哪里获得它。
更新2:
以下是我在属性文件中使用 sts 提供的 wsfed 元数据所做的更改。(我已经删除了实际的base64编码元数据,但不用说,当您从将其发布为和端点的STS注册元数据时,它与获得的XML相同。正如我上面所说,我得到同样的错误:
public void ConfigureAuth(IAppBuilder app)
{
WsFederationConfiguration wsconfig;
app.UseCookieAuthentication(
new CookieAuthenticationOptions
{
AuthenticationType = CookieAuthenticationDefaults.AuthenticationType
});
var metaDataDocument = System.Text.Encoding.UTF8.GetString(
Convert.FromBase64String("...c2NyaXB0b3I+"));
using (var metaDataReader = XmlReader.Create(new StringReader(metaDataDocument), SafeSettings))
{
wsconfig = (new WsFederationMetadataSerializer()).ReadMetadata(metaDataReader);
}
// Apply configuration to wsfed Auth Options
var wsoptions = new WsFederationAuthenticationOptions
{
SignInAsAuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
Configuration = wsconfig,
Wreply = ConfigurationManager.AppSettings["wsfed:Wreply"],
Wtrealm = ConfigurationManager.AppSettings["wsfed:Wtrealm"],
};
wsoptions.TokenValidationParameters.NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn";
// Add WdFederation middleware to Owin pipeline
app.UseWsFederationAuthentication(wsoptions);
}
我和MS团队中的一些人一起工作。这里的问题是我们的 STS 正在使用 SHA1 对令牌进行签名,而新版本的 weFederation 不支持 SHA1,因为它不安全且已弃用。
将WIF 与 owin 一起使用的最简单方法是使用联合元数据(位于 FederationMetadata/2007-06/FederationMetadata.xml)。然后,您根本不需要设置任何内容,这在使用 OWIN WsFederation 中间件配置基于声明的 Web 应用程序中进行了说明。前提当然是您的 STS 发布有意义的FederationMetaData
文档。优点是验证所需的公钥会自动由应用程序获取(并且续订它们是无缝完成的)。
恕我直言,这比您采取的方法要容易得多。
可以按照 OWIN WS 联合身份验证标识提供程序的手动配置进行操作,因为它描述了比你更简单的方法。