【发布时间】:2014-09-04 10:59:44
【问题描述】:
我希望针对内部 ADFS 2 服务使用 WsFederation 身份验证并使用 OWIN 身份验证管道。
什么是中间件的连接顺序,以及在各种场景中需要哪些模块,代码最少?
例如,UseWsFederationAuthentication 似乎应该与UseCookieAuthentication 一起使用,但我不确定正确的AuthenticationType 是什么(this 帖子表明它只是一个标识符字符串,但它的价值是否重要?)或者即使我们仍然需要使用SetDefaultSignInAsAuthenticationType。
我还注意到 Katana 项目讨论板上的 this 线程,其中 Tratcher 提到了一个常见错误,但并没有具体说明代码的哪一部分出错。
以下(使用自定义 SAML 令牌处理程序将令牌字符串读入有效的 XML 文档)可行,但它是最优的吗?
var appURI = ConfigurationManager.AppSettings["app:URI"];
var fedPassiveTokenEndpoint = ConfigurationManager.AppSettings["wsFederation:PassiveTokenEndpoint"];
var fedIssuerURI = ConfigurationManager.AppSettings["wsFederation:IssuerURI"];
var fedCertificateThumbprint = ConfigurationManager.AppSettings["wsFederation:CertificateThumbprint"];
var audienceRestriction = new AudienceRestriction(AudienceUriMode.Always);
audienceRestriction.AllowedAudienceUris.Add(new Uri(appURI));
var issuerRegistry = new ConfigurationBasedIssuerNameRegistry();
issuerRegistry.AddTrustedIssuer(fedCertificateThumbprint, fedIssuerURI);
app.UseCookieAuthentication(
new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType // "Federation"
}
);
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = appURI,
SignOutWreply = appURI,
Configuration = new WsFederationConfiguration
{
TokenEndpoint = fedPassiveTokenEndpoint
},
TokenValidationParameters = new TokenValidationParameters
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
},
SecurityTokenHandlers = new SecurityTokenHandlerCollection
{
new SamlSecurityTokenHandlerEx
{
CertificateValidator = X509CertificateValidator.None,
Configuration = new SecurityTokenHandlerConfiguration
{
AudienceRestriction = audienceRestriction,
IssuerNameRegistry = issuerRegistry
}
}
}
}
);
【问题讨论】:
-
另外,如果我将 WsFederationAuthenticationOptions.Configuration 替换为元数据位置,我突然开始看到以下错误...“在 IAppBuilder 属性中找不到 SignInAsAuthenticationType 的默认值。如果您的身份验证中间件的添加顺序错误,或者缺少一个。”
-
感谢 Tracher,感谢 Vittorio Bertocci 的身份博客,这是我的原始资料之一。但它似乎仍然没有明确解释为什么例如 UseCookieAuthentication 的 AuthenticationType 选项设置为 cookie 而不是 wsfed,我已经看到在各种示例中都使用了这两种方法。
-
每个身份验证中间件都需要自己唯一的身份验证类型。一些中间件还有一个 SignInAsAuthenticationType 字段,用于指定另一个中间件的 AuthenticationType,它们应该使用它们来保存其身份验证的结果。 SetDefaultSignInAsAuthenticationType 设置中间件默认用于 SignInAsAuthenticationType 的值。
-
因此,在该示例中,每个中间件的最终结果如下:CookieAuthMiddleware - AuthType: Cookies; WsFedAuthMiddleware - AuthType:WsFed,SignInAsAuthenticationType:Cookies。
标签: .net owin adfs ws-federation katana