- 使用 WS 联合身份验证在 ASP.NET Core 中的用户进行身份验证Authenticate users with WS-Federation in ASP.NET Core
- 将应用注册到 Active DirectoryRegister the app with Active Directory
- 使用 WS 联合身份验证而无需 ASP.NET Core 标识Use WS-Federation without ASP.NET Core Identity
- 为 ASP.NET Core 标识的外部登录提供程序中添加 WS 联合身份验证Add WS-Federation as an external login provider for ASP.NET Core Identity
使用 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 联合身份验证被动协议的支持。验证该应用的端口是否正确:
备注
这必须是 HTTPS URL。IIS Express 可以在开发过程中托管应用时提供自签名证书。Kestrel 需要手动配置证书。有关更多详细信息,请参阅Kestrel 文档。
在向导的其余部分中单击 "下一步",然后关闭。
ASP.NET Core 标识需要名称 ID声明。从 "编辑声明规则" 对话框中添加一个:
- 在 "添加转换声明规则向导" 中,保留 "默认发送 LDAP 属性作为声明" 模板,然后单击 "下一步"。添加一个规则,将SAM 帐户名称LDAP 属性映射到名称 ID传出声明:
- 单击 "编辑声明规则" 窗口中的 "完成 > " 确定 " 。
Azure Active DirectoryAzure Active Directory
- 导航到 AAD 租户的 "应用注册" 边栏选项卡。单击 "新应用程序注册":
- 输入应用注册的名称。这并不重要到 ASP.NET Core 应用程序。
- 输入应用作为登录 url侦听的 url:
- 单击 "终结点" 并记下 "联合元数据文档" URL。这是 WS 联合身份验证中间件的
MetadataAddress
:
- 导航到新的应用注册。单击 "设置" > 属性",并记下"应用 ID URI"。这是 WS 联合身份验证中间件的
Wtrealm
:
使用 WS 联合身份验证而无需 ASP.NET Core 标识Use WS-Federation without ASP.NET Core Identity
WS 联合身份验证中间件可以在没有标识的情况下使用。例如:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
options.Wtrealm = Configuration["wsfed:realm"];
options.MetadataAddress = Configuration["wsfed:metadata"];
})
.AddCookie();
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = WsFederationDefaults.AuthenticationScheme;
})
.AddWsFederation(options =>
{
options.Wtrealm = Configuration["wsfed:realm"];
options.MetadataAddress = Configuration["wsfed:metadata"];
})
.AddCookie();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
为 ASP.NET Core 标识的外部登录提供程序中添加 WS 联合身份验证Add WS-Federation as an external login provider for ASP.NET Core Identity
- 将AspNetCore上的依赖项添加到项目。
- 将 WS-FEDERATION 添加到
Startup.ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication()
.AddWsFederation(options =>
{
// MetadataAddress represents the Active Directory instance used to authenticate users.
options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";
// Wtrealm is the app's identifier in the Active Directory instance.
// For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
options.Wtrealm = "https://localhost:44307/";
// For AAD, use the App ID URI from the app registration's Properties blade:
options.Wtrealm = "https://wsfedsample.onmicrosoft.com/bf0e7e6d-056e-4e37-b9a6-2c36797b9f01";
});
services.AddControllersWithViews();
services.AddRazorPages();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
Configuration.GetConnectionString("DefaultConnection")));
services.AddDefaultIdentity<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
services.AddAuthentication()
.AddWsFederation(options =>
{
// MetadataAddress represents the Active Directory instance used to authenticate users.
options.MetadataAddress = "https://<ADFS FQDN or AAD tenant>/FederationMetadata/2007-06/FederationMetadata.xml";
// Wtrealm is the app's identifier in the Active Directory instance.
// For ADFS, use the relying party's identifier, its WS-Federation Passive protocol URL:
options.Wtrealm = "https://localhost:44307/";
// For AAD, use the App ID URI from the app registration's Properties blade:
options.Wtrealm = "https://wsfedsample.onmicrosoft.com/bf0e7e6d-056e-4e37-b9a6-2c36797b9f01";
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
AddAuthentication (字符串)重载设置DefaultScheme属性。AddAuthentication (Action<AuthenticationOptions>)重载允许配置身份验证选项,这些选项可用于为不同目的设置默认的身份验证方案。对的后续调用 AddAuthentication
重写以前配置的AuthenticationOptions属性。
对于注册身份验证处理程序的AuthenticationBuilder扩展方法,每个身份验证方案只能调用一次。存在允许配置方案属性、方案名称和显示名称的重载。
用 WS 联合身份验证登录Log in with WS-Federation
浏览到应用,并单击导航头中的 "登录" 链接。使用 WsFederation 登录的选项有:
使用 ADFS 作为提供程序时,该按钮将重定向到 ADFS 登录页:
使用 Azure Active Directory 作为提供程序时,该按钮将重定向到 AAD 登录页:
成功登录新用户重定向到应用的用户注册页: