使用WS-Federation的Identity Server 3
不再支持IdentityServer3。我强烈建议您考虑使用IdentityServer4。
Identity Server 3通过设计是一个OpenID Connect提供程序,但是,许多开发人员没有使用最新,最好的身份验证协议的奢望,或者必须与不兼容OpenID Connect的现有身份提供程序集成。为了解决这个问题,Identity Server团队实现了各种功能,这些功能使开发人员能够使用WS-Federation协议。
OpenID Connect与WS联合
比较OpenID Connect和WS-Federation的最好方法是查看它们存在的原因(即,它们解决的问题)和它们通常使用的技术。
WS-Federation由Microsoft创建,是WS-Trust的扩展,提供了联合的身份体系结构。它允许企业仅从Intranet转移,并开始公开其服务或使用外部服务。在Microsoft环境中,这将使用WS *技术,SOAP以及SAML和XML。您可以将其视为企业对企业之间的通信,这两个企业将使用相同或非常相似的堆栈。
OpenID Connect是最新的认证协议,也是最新的认证协议,它建立在现有OAuth2协议(本身就是授权框架)的基础上,并添加了认证。这通过使用更轻量级的JSON和JSON Web令牌(JWT),通过HTTP进行通信,从而摆脱了紧密绑定的企业方案。这样做的直接好处是,它为您的应用程序打开了移动设备的世界。在我以前的一些文章中,您可以阅读有关OpenID Connect及其好处的更多信息。
要获得WS-Federation,OAuth和OpenID Connect的良好比较概述,请查看NDC 2014的Dominick Baier演讲的前十分钟左右,或者他的Pluralsight课程的第一章:OAuth2,OpenID Connect和JWT简介。
身份服务器和WS联合身份验证
Identity Server支持两种类型的WS-Federation兼容性:一种用于与WS-Federation身份提供程序(例如ADFS)进行通信,另一种用于使用WS-Federation将Identity Server作为身份提供程序公开。
Identity Server作为依赖方
使用Microsoft的OWIN安全软件包时,允许Identity Server使用WS-Federation身份提供程序(例如ADFS)与配置任何其他外部身份提供程序完全相同。
这是使用Microsoft.Owin.Security.WsFederation nuget包中的中间件完成的,并放置在典型的ConfigureIdentityProviders方法中,该方法可以传递到IdentityServerOptions的AuthenticationOptions属性中。如果您不熟悉此过程,请查看Identity Server文档的“ 身份提供程序”部分,其中包含有关如何设置社交提供程序(例如Google)以及我们将要介绍的内容的信息。
使用ADFS身份提供程序的Identity Server
为了演示使用WS-Federation Identity Provider的Identity Server,我们将看一个使用ADFS的简单实现。本示例将假定您具有有效的Identity Server实施(例如在《Identity Server实施指南》中找到的实施)并且具有正常运行的ADFS服务器。
ADFS设置
(https://adfs.domain.com)
依赖方向导
在我们的ADFS安装中,我们可以使用“添加依赖方信任向导”将Identity Server添加为依赖方。
身份服务器设置
我们需要以下nuget软件包:
install-package Microsoft.Owin.Security.WsFederation
现在使用ConfigureIdentityProviders方法:
public static void ConfigureIdentityProviders(IAppBuilder app, string signInAsType) {
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions {
Wtrealm = "urn:identityServer",
MetadataAddress = "https://adfs.domain.com/federationmetadata/2007-06/federationmetadata.xml",
AuthenticationType = "adfs",
Caption = "ADFS",
SignInAsAuthenticationType = signInAsType
});
}
该Wtrealm可我们中ADFS配置早些时候依赖方标识符之一,在这种情况下,金塔:identityServer
,MetaAddress是我们的ADFS服务器的地址,后跟/federationmetadata/2007-06/federationmetadata.xml。
的值AuthenticationType可用于显式指定要使用的身份验证类型,并且Caption是Identity Server登录屏幕中使用的值。与使用Identity Server时所有外部身份提供程序一样,SignInAsAuthenticationType必须由参数驱动,以允许Identity Server对其进行设置。
现在,我们可以运行该解决方案并使用ADFS外部身份提供程序登录,让WS-Federation OWIN中间件接管并进入类似于以下内容的登录屏幕:

如果您需要进一步的帮助将Identity Server设置为ADFS中的依赖方,请查看Vittorio Bertocci的本文。最后提示,如果您在不同的服务器上工作,请确保SSL证书在双方(权威机构和所有方面)均受信任。我发现这可能在某些测试环境中引起混乱,尤其是因为两者都需要HTTPS。同样,在设置声明映射时,请确保已设置名称标识符,因为此名称或Identity Server要求提供主题。也不要陷入认为Identity Server令牌签名证书与SSL证书相同的陷阱。
WS-Federation上的Identity Server
借助Identity Server团队开发的插件,可以使用WS-Federation协议进行Identity Server通信。该插件将Identity Server变成WS-Federation身份提供程序,可以与其他任何WS-Federation资源相同的方式进行通信。
IdentityServer3.WsFed软件包中提供了此插件,其功能类似于Identity Server中间件的核心功能。
我们将再次根据实施指南中的Identity Server实施为基础,并且需要以下软件包:
install-package IdentityServer3.WsFederation
首先,我们需要创建一些依赖方。由于WS-Federation与OpenID Connect完全不同,因此它需要自己的依赖方列表,此实现等效于您习惯的客户端。Identity Server当前没有依赖方的持久层,但是它们确实提供了另一个InMemory服务,该服务使用依赖方列表,我们可以用来演示其功能。
public static class RelyingParties {
public static IEnumerable<RelyingParty> Get() {
return new List<RelyingParty> {
new RelyingParty {
Realm = "urn:testClient",
Name = "testclient",
Enabled = true,
ReplyUrl = "https://localhost:4004/TestClient/",
TokenType = TokenTypes.Saml2TokenProfile11,
ClaimMappings =
new Dictionary<string, string> {
{ "sub", ClaimTypes.NameIdentifier },
{ "name", ClaimTypes.Name },
{ "given_name", ClaimTypes.GivenName },
{ "family_name", ClaimTypes.Surname },
{ "email", ClaimTypes.Email },
{ "upn", ClaimTypes.Upn }
}
}
};
}
}
在这里,我们为依赖方创建领域,回复URL,令牌类型和任何声明映射(在这种情况下,将覆盖更清晰的OpenID Connect声明类型,并用WS-Federation风格的应用程序经常发现的xml名称空间替换它们)。
可用的令牌类型为SAML 1.1、2.0和JWT。在这里,我们主要使用生命周期和算法选项的默认设置,但这些设置在一定程度上也是可以配置的。查看所有依赖方配置选项的官方文档。
SAML 1.1
请注意,如果您使用的是SAML 1.1,则将需要一个声明前缀,因为如果任何声明类型都不采用名称空间/声明的格式,则此令牌类型将出错。这可以使用依赖方DefaultClaimTypeMappingPrefix属性来实现。该属性的值将被前缀为所有没有明确声明映射的声明类型。
现在,我们需要在Identity Server实现中注册它们。这是通过将以下内容添加到我们的owin设置中来完成的:
private void ConfigureWsFederation(IAppBuilder pluginApp, IdentityServerOptions options) {
var factory = new WsFederationServiceFactory(options.Factory);
factory.Register(new Registration<IEnumerable<RelyingParty>>(RelyingParties.Get()));
factory.RelyingPartyService =
new Registration<IRelyingPartyService>(typeof(InMemoryRelyingPartyService));
pluginApp.UseWsFederationPlugin(new WsFederationPluginOptions {
IdentityServerOptions = options,
Factory = factory
});
}
然后,使用的PluginConfiguration属性将该方法注册到我们的Identity Server实现中IdentityServerOptions。
public void Configuration(IAppBuilder app) {
var options = new IdentityServerOptions {
// usual configuration here.
Factory = factory,
PluginConfiguration = ConfigureWsFederation
};
app.UseIdentityServer(options);
}
现在,我们可以开始使用WS-Federation与Identity Server进行交互。Identity Server使用该路径/wsfed进行所有ws-federation交互,从而允许OpenID Connect功能继续。元数据可通过访问/wsfed/metadata。

然后可以使用通常的WS-Federation参数发出请求:
- wa:使用值wsignin1.0登录并使用wsignout1.0退出
- wtrealm:值指示您要登录的依赖方
- whr:这允许您选择一个特定的身份提供程序进行登录(请参阅
AuthenticationType前面的ADFS ),类似于OpenID Connect中使用的acr_values idp属性 - wctx:此值是往返的(请考虑OAuth状态或OIDC随机数)
要使用WS-Federation与Identity Server进行交互,请使用Microsoft.Owin.Security.WsFederationOWIN库。您不需要使用任何第三方插件或软件。
依靠党的坚持
通过使用该IdentityServer3.WsFederation.EntityFramework库,您可以从内存用户存储转移到更易于维护的位置。这将使我们的ConfigureWsFederation方法如下所示:
private void ConfigureWsFederation(IAppBuilder pluginApp, IdentityServerOptions options) {
var efConfig = new EntityFrameworkServiceOptions {
ConnectionString = "DefaultConnection"
};
var factory = new WsFederationServiceFactory(options.Factory);
factory.RegisterRelyingPartyService(efConfig);
pluginApp.UseWsFederationPlugin(new WsFederationPluginOptions {
IdentityServerOptions = options,
Factory = factory
});
}
您可以在WS-Federation Entity Framework存储库本身中找到完整配置的示例。
源代码
我已在Identity Server的示例实现中添加了WS-Federation插件的实现。查找Startup_WsFederationWsFederation的owin:AppStartup值。
来源:https://www.scottbrady91.com/Identity-Server/Identity-Server-3-using-WS-Federation
浙公网安备 33010602011771号