oauth2.0 如何在IdentityServer4中为访问令牌添加自定义声明?[已关闭]

5fjcxozz  于 2023-08-02  发布在  其他
关注(0)|答案(4)|浏览(115)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答这个问题。
5年前关闭。
Improve this question
我用的是IdentityServer4
我想添加其他自定义声明访问令牌,但我无法做到这一点。我修改了Quickstart5,并添加了ASP.NET Identity Core和Coemgen below建议的通过ProfileService的自定义声明。
你可以在这里下载我的代码:[zip package][3]。(它基于:Quickstart5和ASP.NET Identity Core,并通过ProfileService添加声明)。
问题:未执行GetProfileDataAsync。

6l7fqoea

6l7fqoea1#

您应该实现自己的ProfileService。看看这篇文章,当我实现同样的事情时,我遵循了这篇文章:
https://damienbod.com/2016/11/18/extending-identity-in-identityserver4-to-manage-users-in-asp-net-core/
下面是我自己实现的一个例子:

public class ProfileService : IProfileService
{
    protected UserManager<ApplicationUser> _userManager;

    public ProfileService(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        //>Processing
        var user = await _userManager.GetUserAsync(context.Subject);

        var claims = new List<Claim>
        {
            new Claim("FullName", user.FullName),
        };

        context.IssuedClaims.AddRange(claims);
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {
        //>Processing
        var user = await _userManager.GetUserAsync(context.Subject);
        
        context.IsActive = (user != null) && user.IsActive;
    }
}

字符串
不要忘记在Startup.cs中配置服务(通过this answer

services.AddIdentityServer()
    .AddProfileService<ProfileService>();

nnt7mjpx

nnt7mjpx2#

好了,这里的问题是:

虽然您已经正确配置了可用Identity资源(包括标准和自定义),但在调用API资源时,您还需要明确定义哪些是必需的。为了定义这个,你必须在ExampleIdentityServer项目中的Config.cs类中,像在new ApiResouirce构造函数中一样,提供第三个参数。只有这些才会包含在access_token

// scopes define the API resources in your system
public static IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource("api1", "My API", new[] { JwtClaimTypes.Subject, JwtClaimTypes.Email, JwtClaimTypes.Phone, etc... })
    };
}

字符串
本质上,这意味着我为我的组织配置了身份声明,但可能涉及多个API,并且并非所有API都使用所有可用的配置文件声明。这也意味着这些将存在于你的ClaimsPrincipal中,其余的仍然可以通过“userinfo”端点作为普通的http调用来访问。

注意:关于刷新令牌:

如果您选择通过AllowOfflineAccess = true启用刷新令牌,则在刷新access_token“**GetProfileDataAsync does not executed!因此,access_token中的声明保持不变,尽管您获得了具有更新生命周期的新access_token。如果是这种情况,您可以通过在客户端配置上设置UpdateAccessTokenClaimsOnRefresh=true来强制它们总是从Profile服务刷新。

a7qyws3x

a7qyws3x3#

发现问题。
在startup.cs中,将.AddProfileService<ProfileService>()添加到services.AddIdentityServer(),而不是添加services.AddTransient<IProfileService, ProfileService>();
你最终会得到

services.AddIdentityServer()
    .AddTemporarySigningCredential()
    .AddInMemoryIdentityResources(Config.GetIdentityResources())
    .AddInMemoryApiResources(Config.GetApiResources())
    .AddInMemoryClients(Config.GetClients())
    .AddAspNetIdentity<ApplicationUser>()
    .AddProfileService<ProfileService>();

字符串
感谢Coemgen的帮助!代码没有问题,只是启动错误。

v1uwarro

v1uwarro4#

您可以通过在config类中的GetIdentityResources()中使用UserClaims选项来包含任何声明:

**UserClaims:**身份令牌应包含的关联用户声明类型列表。(根据官方文档)http://docs.identityserver.io/en/release/reference/identity_resource.html#refidentityresource

相关问题