我正在尝试向IdentityServer4添加WSFederation身份验证提供程序。 最近发布了Microsoft.AspNetCore.Authentication.WsFederation Preview 2,我可以将其添加到正常的Asp.NetCore-Application。
但我很难将其添加到IdentityServer4 EntityFramework-Quickstart-Example。
这就是我在Startup.cs / ConfigureServices方法中添加AuthenticationProvider的方法:
services.AddAuthentication()
.AddWsFederation("WsFederation", options =>
{
options.Wtrealm = realm;
options.MetadataAddress = metadata;
})
我在前端获得了WSFederation的按钮,我也可以登录。但是在回调之后我收到了这个错误:
InvalidOperationException:缺少子声明 IdentityServer4.Hosting.IdentityServerAuthenticationService.AssertRequiredClaims(ClaimsPrincipal 委托人)
我可以理解它来自何处,它是IdentityServer4的IdentityServerAuthenticationService.cs中的this line,它期望一个" sub" -claim - WSFed不会返回这样的声明:
if (principal.FindFirst(JwtClaimTypes.Subject) == null) throw new InvalidOperationException("sub claim is missing");
据我所知,我无法配置此声明,尽管quickstart项目中有一些表似乎可以用于此,尤其是那些2:
我已经尝试将我想要使用的声明添加到表格中,而不是主题声明,但它似乎没有任何影响,我也不知道数据库如何映射到身份提供者我在代码中添加。我对任何有关后续步骤的提示感到高兴,或者如果您知道任何示例,那将会更好。
PS:关于这个主题已经有一些问题,但它们都来自WSFederation的.Net Core实现可用之前,或者参考WSFederation服务器的示例,而不是客户端。答案 0 :(得分:4)
感谢@leastprivilege我实施了以下解决方法来提供子索赔:
services.AddAuthentication()
.AddWsFederation("WsFederation", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.Wtrealm = realm;
options.MetadataAddress = metadata;
options.Events.OnTicketReceived += OnTicketReceived;
})
/* some more code inbetween */
/// <summary>
/// Transform the UPN-claim to the sub-claim to be compatible with IdentityServer4
/// </summary>
private async Task OnTicketReceived(TicketReceivedContext ticketReceivedContext)
{
var identity = ticketReceivedContext.Principal.Identities.First();
identity.AddClaim(new Claim("sub", ticketReceivedContext.Principal.FindFirstValue("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier")));
}
答案 1 :(得分:2)
您需要对来自WS-Fed提供商的索赔进行索赔转换。通过处理WS-Fed处理程序本身的事件 - 或者使用&#34; ExternalLoginCallback&#34;快速入门UI中使用的模式: