如何使用IdentityServer4为MVC客户端添加其他声明

时间:2019-12-02 18:52:44

标签: asp.net-core identityserver4

我正在使用here找到的IdentityServer4“ AspNetCoreAndApis”示例应用程序

它具有令牌服务器和MVC客户端应用程序。

身份服务器项目具有使用其演示服务器-https://demo.identityserver.io/

设置的外部OIDC身份验证提供程序

MvcClient中命中受保护的端点后,将其重定向到本地身份服务器,选择并通过演示服务器进行身份验证,然后到达本地身份服务器的ExternalController回调。此时,我想向用户发出其他声明,并在MvcClient中提供它们。

回调中有代码添加additionalLocalClaims并发布cookie。我尝试添加另一个声明:

var additionalLocalClaims = new List<Claim>();
additionalLocalClaims.Add(new Claim("TestKey", "TestValue"));
await HttpContext.SignInAsync(user.SubjectId, user.Username, provider, localSignInProps, additionalLocalClaims.ToArray());

但是,当用户到达HomeController的{​​{1}}时,此声明就不存在了。

我认为我不正确地了解在哪里使用哪种身份验证方案以及相关cookie的功能。

编辑:

为响应下面的第一条评论,我尝试将声明附加到请求的范围,但仍然没有运气-这是内存资源存储区:

MvcClient

MvcClient都被允许使用api1范围,并请求它。

1 个答案:

答案 0 :(得分:0)

您的客户MVC可以从ID令牌或UserInfo端点获取用户的自定义声明。

要向ID令牌添加声明,您可以设置客户端的配置:AlwaysIncludeUserClaimsInIdToken。但是建议不要将所有用户声明都包含在ID令牌中,建议您关注ID令牌的大小。

一种更好的解决方案是使您的客户端应用从UserInfo端点获取用户的声明:

public class MyProfileService : IProfileService
{
    public MyProfileService()
    { }

    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {

        var claims = new List<Claim>()
        {

            new Claim("TestKey", "TestValue")
        };
        context.IssuedClaims.AddRange(claims);
        return Task.CompletedTask;
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        // await base.IsActiveAsync(context);
        return Task.CompletedTask;
    }
}

在DI中注册:

services.AddTransient<IProfileService, MyProfileService>();

IProfileService服务可用于向ID令牌,访问令牌和UserInfo端点添加声明。默认情况下,自定义声明不使用IProfileService参与ID令牌事件,ID令牌大小是上述原因。因此,您可以使用OIDC中间件config来使您的客户端应用从UserInfo端点获取声明:

options.Scope.Add("profile");
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapJsonKey("TestKey", "TestKey");

以上代码将添加OIDC profile权限以从端点获取声明,并使用ID令牌向connect/userinfo端点发送请求,并获取声明并将名称为TestKey的声明映射到您客户的索赔原则并保存到cookie中。现在,您可以在MVC中使用User.Claims获得声明。