IdentityServer4作为WSFederation-client与.Net Core WSFederation preview2

时间:2017-12-11 12:09:32

标签: c# asp.net-core .net-core identityserver4 ws-federation

我正在尝试向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: dbo.IdentityResources-table dbo.IdentityClaims-table

我已经尝试将我想要使用的声明添加到表格中,而不是主题声明,但它似乎没有任何影响,我也不知道数据库如何映射到身份提供者我在代码中添加。我对任何有关后续步骤的提示感到高兴,或者如果您知道任何示例,那将会更好。

PS:关于这个主题已经有一些问题,但它们都来自WSFederation的.Net Core实现可用之前,或者参考WSFederation服务器的示例,而不是客户端。

2 个答案:

答案 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中使用的模式:

https://github.com/IdentityServer/IdentityServer4.Quickstart.UI/blob/release/Quickstart/Account/AccountController.cs#L203