在 ASP.Net 应用程序上结合 ADFS 身份验证和 JWT 承载

Posted

技术标签:

【中文标题】在 ASP.Net 应用程序上结合 ADFS 身份验证和 JWT 承载【英文标题】:Combine ADFS Authentication and JWT Bearer on ASP.Net Application 【发布时间】:2020-06-02 05:15:05 【问题描述】:

我有一个用 ASP.NET 编写的 Web API 和一个用 Angular 编写的前端。 API 端的身份验证可以配置为使用 Windows 身份验证、ADFS 身份验证或 JWT 承载。但对于特定部署,仅支持一种类型的身份验证。

对于 ADFS 身份验证,我在 Angular 端使用 angular-oauth2-oidc

在 API 方面,这就是我在 startup.cs 文件中配置 ADFS 身份验证的方式。

    public void ConfigureAuth(IAppBuilder app)
    
        app.UseActiveDirectoryFederationServicesBearerAuthentication
            (new ActiveDirectoryFederationServicesBearerAuthenticationOptions
            
                BackchannelCertificateValidator = new CertificateValidator(),
                MetadataEndpoint = System.Configuration.ConfigurationManager.AppSettings["ida:ADFSMetadata"],
                TokenValidationParameters = new TokenValidationParameters()
                
                    ValidAudience = System.Configuration.ConfigurationManager.AppSettings["ida:Audience"],
                    ValidIssuer = System.Configuration.ConfigurationManager.AppSettings["ida:ValidIssuer"]
                ,
                Provider = new OAuthBearerAuthenticationProvider()
                
                    OnValidateIdentity = async context =>
                    
                        var identity = context.Ticket.Identity;
                        var emailAddress = identity.FindFirst(ClaimTypes.Email).Value;
                        using (AuthRepository repo = new AuthRepository())
                        
                            var userManager = repo.GetUserManager();
                            var aspNetUser = userManager.FindByEmailAsync(emailAddress).GetAwaiter().GetResult();
                            if (aspNetUser != null)
                            
                                identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, aspNetUser.Id));
                                await ProfileManager.AddClaimsToIdentity(identity, aspNetUser.SelectedProfile);
                            
                        
                    
                
            );
    

我想要将 ADFS 身份验证与 JWT Bearer 结合起来,这样如果输入的电子邮件地址与我的公司域相关联,例如“email@mycompany.com”,它会针对 ADFS 进行身份验证,如果它是任何其他电子邮件, 它使用 JWT Bearer 身份验证。

我知道可以在 ASP.NET Core 中组合不同类型的身份验证(例如 here),但我的 API 不是使用 Core 构建的。

我试图为 ASP.NET 找到相同的功能,但找不到。我想知道这是否可以实现,如果可以,如果有人能给我指点,我将不胜感激。

【问题讨论】:

【参考方案1】:

关于这个问题:

我想要将 ADFS 身份验证与 JWT Bearer 结合起来,这样如果输入的电子邮件地址与我的公司域相关联,例如“email@mycompany.com”,它会针对 ADFS 进行身份验证,如果它是任何其他电子邮件, 它使用 JWT Bearer 身份验证。

据我所知,有可能。

您是否尝试过 Microsoft 身份平台?这是用于管理身份的特定 Azure SDK,包括对 Windows Server 2012 及更高版本中的 ADFS 3.0 的支持。 它也更容易使用,因为这个 MIcrosoft Identity Platform 使用 OpenIDConnect 和 OAuth 2.0,因此您可以使用具有 JWT 承载的 ADFS。

这是官方文档页面:https://docs.microsoft.com/en-us/azure/active-directory/develop/

着陆页有各种示例供您入门。由于您使用的是 .NET Core,Microsoft Identity Platform SDK 有您可以使用的示例,即使用 .NET Core 的示例: https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-aspnet-core-webapp

这是一个 github 存储库,其中包含该教程旁边的各种示例: https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2

更新 1: Windows Server 2016 中 ADFS 的当前文档仅显示了对 OAuth2/OpenIDConnect 的支持,并且它使用的是 JWT Bearer: https://docs.microsoft.com/en-us/windows-server/identity/ad-fs/development/ad-fs-openid-connect-oauth-concepts

我在MS官方文档中搜索过具体的“ADFS Bearer Token Authentication”,完全没有。当前所有文档都提到了 ADFS 3.0 及更高版本(包括 Windows Server 2016 和 2019 中的 ADFS)正在使用 OAuth2/OpenIDConnect。

【讨论】:

感谢您的回复。请注意,我没有使用 ASP.NET Core。到目前为止,使用承载令牌的 ADFS 身份验证对我来说工作正常。我想要的是使用基于 JWT 令牌的身份验证或 ADFS 承载令牌身份验证有条件地进行身份验证。 好的,你从哪里得到这个“ADFS Bearer Token Authentication”? ADFS 3.0 及更高版本支持 OAuth2.0/OpenIDConnect 身份验证,Microsoft Windows ADFS 中没有称为“ADFS Bearer Token Authentication”的功能。 这是一个错字。实际上,Angular 前端与 Web API 是解耦的,使用的方法是 JWT + OAUTH/OIDC,您可以在其中获取访问令牌。所以基本上“身份验证发生”在前端,后端检查请求是否有效,或者换句话说,请求的标头中是否有有效的访问令牌。我使用的方法与本文中使用的方法非常相似medium.com/@gabriel.faraday.barros/…

以上是关于在 ASP.Net 应用程序上结合 ADFS 身份验证和 JWT 承载的主要内容,如果未能解决你的问题,请参考以下文章

ADFS 和 ASP.NET

使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1

SAML 与 ASP.NET Core 身份的集成

针对 ADAM 和 AD FS 的 ASP.NET MVC 3 SSO

ADFS 2.0 Web 应用注销

为Azure Web Site 添加ADFS验证支持之二 在代码里使用ADFS