首页 > 解决方案 > 在 ASP.Net 应用程序上结合 ADFS 身份验证和 JWT 承载

问题描述

我有一个用 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 承载认证。

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

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

标签: c#asp.net.netauthenticationjwt

解决方案


关于这个问题:

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

据我所知,这是可能的。

您是否尝试过 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/开发/ad-fs-openid-connect-oauth-concepts

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


推荐阅读