当前位置:  开发笔记 > 编程语言 > 正文

如果没有第二次调用服务器,请求确认IdentityServer 3不支持自定义声明

如何解决《如果没有第二次调用服务器,请求确认IdentityServer3不支持自定义声明》经验,为你挑选了1个好方法。

在我看来,我无法在我第一次调用Identity Server的响应中添加自定义声明(这是特定于用户的).有人可以证实这个假设吗?

以下是我们在应用程序中的操作:使用ResourceOwner Flow,我们的Web应用程序(服务器端)调用Identity Server发送用户的logonID,密码和范围.

我们找回一个包含sub,idp,client_id等标准声明的JWT; 但我们想补充一点.为简化起见,假设另一个声明是用户的emailAddress.

看来我们必须再次调用Identity Server并获取一个新令牌.那是对的吗?是不是有某些方法可以在初始调用中获得该值?



1> Rob Kraft..:

很抱歉成为回答我自己的问题的人,但我发现了如何使这项工作.

    创建自定义范围.确保Type = ScopeType.Resource和IncludeAllClaimsForUser = false,并将Scope的集合添加到作用域,并将ScopeClaim的第二个参数设置为true.

    将自定义范围添加到客户端.

    在您的IUserService覆盖中,在AuthenticateLocalAsync中,确保将user.Claims作为AuthenticateResult调用中的第3个参数传递.

    在您的IUserService覆盖中,在GetProfileDataAsync中添加以下代码:

    if (context.RequestedClaimTypes != null)
    {
        List newclaims = new List();
        foreach (Claim claim in context.Subject.Claims)
        {
            if (context.RequestedClaimTypes.Contains(claim.Type))
            {
                newclaims.Add(claim);
            }
        }
        context.IssuedClaims = newclaims;
    }
    return Task.FromResult(context.IssuedClaims);
    

    最后,为了确保每次用户登录时都会触发GetProfileDataAsync,而不仅仅是第一次,请确保您没有启用缓存.这可能意味着删除启动中的一行代码,如下所示:factory.ConfigureUserServiceCache().

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有