使用Identity Server 3发出登录cookie后,在客户端应用程序中获取自定义声明

时间:2019-02-03 11:49:45

标签: asp.net-mvc identityserver3

我们正在进行学习 Identity Server的工作,最终目的是将我们现有的身份验证服务迁移到该服务器。出于公司,物流和兼容性方面的原因,我们坚持使用IS3。我们还没有准备好过渡到Core。

我的问题有两个部分:

1)我已经修改了示例应用available here,该应用使用了自定义登录页面,以便浏览器提示用户输入X509Certificate2(作为部分登录)。用户输入密码,证书用于调用另一个返回用户特定数据的端点。此时,我们希望根据返回的数据创建自定义用户声明,然后发布Cookie。

一切正常,直到客户端收到cookie。 我似乎无法提取添加到客户端应用程序上AuthenticatedLogin的{​​{1}}对象中的自定义声明。 客户端已配置为访问所有范围

似乎我缺少一些非常基本的东西。我在这里做错什么了吗?请记住,这些只是出于测试目的的毫无意义的主张。

2)这是发出索赔的可接受方法吗?由于我们的角色非常复杂,因此我们可能会使用返回的cookie来调用单独的授权服务。

我已经实现了自定义用户服务,其中Claims重定向到了自定义登录页面:

PreAuthenticateAsync

创建声明并调用 public override Task PreAuthenticateAsync(PreAuthenticationContext context) { var id = ctx.Request.Query.Get("signin"); context.AuthenticateResult = new AuthenticateResult("~/custom/login?id=" + id, (IEnumerable<Claim>)null); return Task.FromResult(0); } 的控制器方法:

IssueLoginCookie

带有[RequireHttps] [Route("core/custom/login")] [HttpPost] public ActionResult Index(string id, string password) { var userData = GetUser(password); var owinEnvironment = Request.GetOwinContext().Environment; var authenticatedLogin = new AuthenticatedLogin { IdentityProvider = Constants.BuiltInIdentityProvider, Name = userData.UserName, Subject = userData.EmailAddress, Claims = GetClaims(userData), PersistentLogin = false }; owinEnvironment.IssueLoginCookie(authenticatedLogin); var msg = owinEnvironment.GetSignInMessage(id); var returnUrl = msg.ReturnUrl; owinEnvironment.RemovePartialLoginCookie(); return Redirect(returnUrl); } // add our CUSTOM claims private List<Claim> GetClaims(CustomUser authenticatedUser) { List<Claim> claims = new List<Claim>(); claims.Add(new Claim("claim1", authenticatedUser.CustomClaim1)); claims.Add(new Claim("claim2", authenticatedUser.CustomClaim2)); claims.Add(new Claim("claim3", authenticatedUser.CustomClaim3)); claims.Add(new Claim("Claim4", authenticatedUser.CustomClaim4)); return claims; } 装饰器的客户端控制器方法:

Authorize

已注册的内存范围:

[Authorize]
public ActionResult About()
{
    // "CustomClaim1", "CustomClaim2" etc are not there :( 
    return View((User as ClaimsPrincipal).Claims);
}

最后是客户的var scope1 = new Scope { Enabled = true, Name = "user", Type = ScopeType.Identity, Claims = new List<ScopeClaim> { new ScopeClaim("CustomClaim1", true), new ScopeClaim("CustomClaim2", true), new ScopeClaim("CustomClaim3", true), new ScopeClaim("CustomClaim4", true), }, IncludeAllClaimsForUser = true };

Configuration

1 个答案:

答案 0 :(得分:0)

您好,尝试在客户端中添加范围

 app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            Authority = "https://localhost/idprov/core",
            ClientId = "mvc",
            RedirectUri = "https://localhost/dummyclient/About",
            ResponseType = "id_token",
            ClientSecret = "secret",
            Scope = "openid partyuser CustomClaim1 CustomClaim2",
            SignInAsAuthenticationType = "Cookies",
        });