使用 WS 联合身份验证在 ASP.NET Core 中的用户进行身份验证Authenticate users with WS-Federation in ASP.NET Core

本文内容

本教程演示如何使用户能够使用 WS 联合身份验证提供程序(例如 Active Directory 联合身份验证服务(ADFS)或Azure Active Directory (AAD))登录。它使用Facebook、Google 和 external 提供程序身份验证中介绍的 ASP.NET Core 2.0 示例应用。

对于 ASP.NET Core 2.0 应用, WsFederation提供 WS 联合身份验证支持。此组件从Owin移植,并共享该组件的许多机制。不过,这些组件在一些重要的方面有所不同。

默认情况下,新的中间件:

  • 不允许未经请求的登录。WS 联合身份验证协议的此功能容易受到 XSRF 攻击。但是,可以通过 AllowUnsolicitedLogins 选项来启用它。
  • 不会检查每个窗体张贴内容中的登录消息。仅检查对 CallbackPath 的请求以进行登录。 CallbackPath 默认为 /signin-wsfed 但可通过WsFederationOptions类的继承RemoteAuthenticationOptions. CallbackPath属性进行更改。通过启用SkipUnrecognizedRequests选项,可以将此路径与其他身份验证提供程序共享。

将应用注册到 Active DirectoryRegister the app with Active Directory

Active Directory 联合身份验证服务Active Directory Federation Services

  • 从 ADFS 管理控制台打开服务器的 "添加信赖方信任向导":

添加信赖方信任向导:欢迎

  • 选择手动输入数据:

添加信赖方信任向导:选择数据源

  • 为信赖方输入显示名称。名称并不重要到 ASP.NET Core 应用程序。

  • AspNetCore不支持令牌加密,因此请不要配置令牌加密证书:

添加信赖方信任向导:配置证书

  • 使用应用的 URL 启用对 WS 联合身份验证被动协议的支持。验证该应用的端口是否正确:

添加信赖方信任向导:配置 URL

备注

这必须是 HTTPS URL。IIS Express 可以在开发过程中托管应用时提供自签名证书。Kestrel 需要手动配置证书。有关更多详细信息,请参阅Kestrel 文档

  • 在向导的其余部分中单击 "下一步",然后关闭

  • ASP.NET Core 标识需要名称 ID声明。从 "编辑声明规则" 对话框中添加一个:

编辑声明规则

  • 在 "添加转换声明规则向导" 中,保留 "默认发送 LDAP 属性作为声明" 模板,然后单击 "下一步"。添加一个规则,将SAM 帐户名称LDAP 属性映射到名称 ID传出声明:

添加转换声明规则向导:配置声明规则

  • 单击 "编辑声明规则" 窗口中的 "完成 > " 确定 "

Azure Active DirectoryAzure Active Directory

  • 导航到 AAD 租户的 "应用注册" 边栏选项卡。单击 "新应用程序注册":

Azure Active Directory:应用注册

  • 输入应用注册的名称。这并不重要到 ASP.NET Core 应用程序。
  • 输入应用作为登录 url侦听的 url:

Azure Active Directory:创建应用注册

  • 单击 "终结点" 并记下 "联合元数据文档" URL。这是 WS 联合身份验证中间件的 MetadataAddress

Azure Active Directory:终结点

  • 导航到新的应用注册。单击 "设置" > 属性",并记下"应用 ID URI"。这是 WS 联合身份验证中间件的 Wtrealm

Azure Active Directory:应用注册属性

使用 WS 联合身份验证而无需 ASP.NET Core 标识Use WS-Federation without ASP.NET Core Identity

WS 联合身份验证中间件可以在没有标识的情况下使用。例如:

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddAuthentication(sharedOptions =>
  4. {
  5. sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  6. sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
  7. })
  8. .AddWsFederation(options =>
  9. {
  10. options.Wtrealm = Configuration["wsfed:realm"];
  11. options.MetadataAddress = Configuration["wsfed:metadata"];
  12. })
  13. .AddCookie();
  14. services.AddControllersWithViews();
  15. services.AddRazorPages();
  16. }
  17. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  18. {
  19. if (env.IsDevelopment())
  20. {
  21. app.UseDeveloperExceptionPage();
  22. app.UseDatabaseErrorPage();
  23. }
  24. else
  25. {
  26. app.UseExceptionHandler("/Home/Error");
  27. app.UseHsts();
  28. }
  29. app.UseHttpsRedirection();
  30. app.UseStaticFiles();
  31. app.UseRouting();
  32. app.UseAuthentication();
  33. app.UseAuthorization();
  34. app.UseEndpoints(endpoints =>
  35. {
  36. endpoints.MapControllerRoute(
  37. name: "default",
  38. pattern: "{controller=Home}/{action=Index}/{id?}");
  39. endpoints.MapRazorPages();
  40. });
  41. }
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddAuthentication(sharedOptions =>
  4. {
  5. sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  6. sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
  7. sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
  8. })
  9. .AddWsFederation(options =>
  10. {
  11. options.Wtrealm = Configuration["wsfed:realm"];
  12. options.MetadataAddress = Configuration["wsfed:metadata"];
  13. })
  14. .AddCookie();
  15. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  16. }
  17. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  18. {
  19. if (env.IsDevelopment())
  20. {
  21. app.UseDeveloperExceptionPage();
  22. app.UseDatabaseErrorPage();
  23. }
  24. else
  25. {
  26. app.UseExceptionHandler("/Home/Error");
  27. app.UseHsts();
  28. }
  29. app.UseHttpsRedirection();
  30. app.UseStaticFiles();
  31. app.UseCookiePolicy();
  32. app.UseAuthentication();
  33. app.UseMvc(routes =>
  34. {
  35. routes.MapRoute(
  36. name: "default",
  37. template: "{controller=Home}/{action=Index}/{id?}");
  38. });
  39. }

为 ASP.NET Core 标识的外部登录提供程序中添加 WS 联合身份验证Add WS-Federation as an external login provider for ASP.NET Core Identity

  • AspNetCore上的依赖项添加到项目。
  • 将 WS-FEDERATION 添加到 Startup.ConfigureServices
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<ApplicationDbContext>(options =>
  4. options.UseSqlServer(
  5. Configuration.GetConnectionString("DefaultConnection")));
  6. services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
  7. .AddEntityFrameworkStores<ApplicationDbContext>();
  8. services.AddAuthentication()
  9. .AddWsFederation(options =>
  10. {
  11. // MetadataAddress represents the Active Directory instance used to authenticate users.
  12. options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";
  13. // Wtrealm is the app's identifier in the Active Directory instance.
  14. // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
  15. options.Wtrealm = "https://localhost:44307/";
  16. // For AAD, use the App ID URI from the app registration's Properties blade:
  17. options.Wtrealm = "https://wsfedsample.onmicrosoft.com/bf0e7e6d-056e-4e37-b9a6-2c36797b9f01";
  18. });
  19. services.AddControllersWithViews();
  20. services.AddRazorPages();
  21. }
  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddDbContext<ApplicationDbContext>(options =>
  4. options.UseSqlServer(
  5. Configuration.GetConnectionString("DefaultConnection")));
  6. services.AddDefaultIdentity<IdentityUser>()
  7. .AddEntityFrameworkStores<ApplicationDbContext>();
  8. services.AddAuthentication()
  9. .AddWsFederation(options =>
  10. {
  11. // MetadataAddress represents the Active Directory instance used to authenticate users.
  12. options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";
  13. // Wtrealm is the app's identifier in the Active Directory instance.
  14. // For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
  15. options.Wtrealm = "https://localhost:44307/";
  16. // For AAD, use the App ID URI from the app registration's Properties blade:
  17. options.Wtrealm = "https://wsfedsample.onmicrosoft.com/bf0e7e6d-056e-4e37-b9a6-2c36797b9f01";
  18. });
  19. services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
  20. }

AddAuthentication (字符串)重载设置DefaultScheme属性。AddAuthentication (Action<AuthenticationOptions>)重载允许配置身份验证选项,这些选项可用于为不同目的设置默认的身份验证方案。对的后续调用 AddAuthentication 重写以前配置的AuthenticationOptions属性。

对于注册身份验证处理程序的AuthenticationBuilder扩展方法,每个身份验证方案只能调用一次。存在允许配置方案属性、方案名称和显示名称的重载。

用 WS 联合身份验证登录Log in with WS-Federation

浏览到应用,并单击导航头中的 "登录" 链接。使用 WsFederation 登录的选项有: 登录页面

使用 ADFS 作为提供程序时,该按钮将重定向到 ADFS 登录页: ADFS 登录页上

使用 Azure Active Directory 作为提供程序时,该按钮将重定向到 AAD 登录页: AAD 登录页

成功登录新用户重定向到应用的用户注册页: 注册页面