c# - 我如何将计算字段添加到 access_token/id_token

标签 c# asp.net-core oauth-2.0 identityserver4 openid-connect

我正在使用 IdentityServer4,我想将计算字段添加到 access_token/id_token。

此类字段的示例可以是用户的 IP(或 token 绑定(bind)哈希), token 将附加到该 IP。

问:我该怎么做?

提前致谢,抱歉英语不好。

最佳答案

您可以通过在 UserManager 实现中创建一个方法来添加包含计算字段的声明。

public class UserManager: IUserManager
{
    ...other code here removed for simplicity

    public List<Claim> GetClaimsAsync(Models.User user)
    {
        var claims = new List<Claim>();             

        claims.Add(new Claim(JwtClaimTypes.PreferredUserName, user.USER_ID.ToString().Trim()));

        //This next line is pseudo coded and would need to be coded.
        claims.Add(new Claim("MyCalculatedIP", MyFunctionToGetUserIP().ToString().Trim()));


        return claims;
    }

    ...other code here removed for simplicity
}

从实现 IProfileService 的类中调用它。我将我的 ProfileService 命名为。

/// <summary>
///  implement the interface called "IProfileService", which is used for authorization.
/// </summary>
public class ProfileService : IProfileService
{
    IUserManager _myUserManager;
    private readonly ILogger<ProfileService> _logger;


    public ProfileService(ILogger<ProfileService> logger, IUserManager userManager)
    {
        _logger = logger;
        _myUserManager = userManager;
    }

    public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
    {            
        var user = await _myUserManager.Find(context.UserName, context.Password);

        if (user != null)
        {
            context.Result = new GrantValidationResult(
                             subject: user.USER_ID,
                             authenticationMethod: "custom",
                             claims: await _myUserManager.GetClaimsAsync(user));
        }
        else
        {                 
            context.Result = new GrantValidationResult(
                             TokenRequestErrors.InvalidRequest, 
                    errorDescription: "UserName or Password Incorrect.");
        }             
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {
        _logger.LogDebug("Get profile called for {subject} from {client} with {claimTypes} because {caller}",
            context.Subject.GetSubjectId(),
            context.Client.ClientName,
            context.RequestedClaimTypes,
            context.Caller);

        var sub = context.Subject.FindFirst("sub")?.Value;
        if (sub != null)
        {
            var user = await _myUserManager.FindByNameAsync(sub);
            var cp = getClaims(user);

            var claims = cp.Claims;                

            context.IssuedClaims = claims.ToList();
        }
    }

    private ClaimsPrincipal getClaims(User user)
    {
        if (user == null)
        {
            throw new ArgumentNullException(nameof(user));
        }

        var id = new ClaimsIdentity();

        id.AddClaims(_myUserManager.GetClaimsAsync(user));

        return new ClaimsPrincipal(id);
    }

    /// <summary>
    /// Called by IdentityServer Middleware.
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public async Task IsActiveAsync(IsActiveContext context)
    {
        var sub = context.Subject.GetSubjectId();
        var user = await _myUserManager.FindByNameAsync(sub);
        context.IsActive = user != null;
        return;
    }
}

在 Startup 类中添加用于依赖注入(inject)的 ProfileService 对象。

public void ConfigureServices(IServiceCollection services)
{
     ...other code here removed for simplicity

     Services.AddTransient<IProfileService, ProfileService>();

     ...other code here removed for simplicity
}

有用的资源 artile

关于c# - 我如何将计算字段添加到 access_token/id_token,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49082647/

相关文章:

c# - 构建过程中出现错误 "The type or namespace name could not be found"

c# - 如何使用 FluentAssertions 在 XUnit 中测试 MediatR 处理程序

iis - 使用 .NET Core 2.2 的 Kestrel 与 IIS+Kestrel 性能(吞吐量)

使用 OAuth 2.0 的 Java 和 Google Spreadsheets API 授权

c# - 如果您仅更改值,List<T> 线程安全吗?

C#窗口定位

c# - 如何正确检测 Windows、Linux 和 Mac 操作系统

c# - 如何在 ASP.NET Core 2.0 web api 中添加来自 IdentityServer4 和 Auth0 的 Jwt 身份验证?

oauth - 使用 OAuth 创建 client_id 并注册帐户

java - 在用 java 编写的桌面应用程序中自动化 Twitter 登录