新文章 网摘 文章 随笔 日记

使用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中间件接管并进入类似于以下内容的登录屏幕:

ADFS登录屏幕

如果您需要进一步的帮助将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联合元数据

然后可以使用通常的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

 

posted @ 2020-08-03 11:27  岭南春  阅读(266)  评论(0)    收藏  举报