Как заполнить пользовательское утверждение ресурса идентификации для клиента гибридного потока?


У меня есть сервер IdentityServer4 с пользовательским ресурсом идентификации:

new IdentityResource
{
    Name = "custom.profile",
    UserClaims = new[] { "location" }
}

Этот ресурс используется пользователями ASP.NET клиент MVC, соединяющийся с гибридным потоком OIDC и без страницы согласия:

new Client
                {
                    ClientId = "client.mvc",
                    ClientName = "MVC Core Client",
                    AllowedGrantTypes = GrantTypes.Hybrid,
                    ...
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "custom.profile"
                    },

Вход осуществляется вручную в <idsrv>/Login/DoLogin:

public async Task<IActionResult> DoLogin(LoginInputModel model)
        {
            if (ModelState.IsValid)
            {
                if (model.Username == "test.user" && model.Password == "password")
                {
                    Guid userId = new Guid("8da49efb-a1aa-4253-bb7f-56cc6c532b78");

                    await HttpContext.Authentication.SignInAsync(userId.ToString(), model.Username);

                    if (_interaction.IsValidReturnUrl(model.ReturnUrl))
                    {
                        return Redirect(model.ReturnUrl);
                    }

                    return Redirect("~/");
                }

                ModelState.AddModelError("", "Invalid username or password.");
            }

Мой вопрос заключается в том, как / где я могу заполнить это" location "значение области" custom.profile " для пользователя?

1 3

1 ответ:

Вам в основном нужно реализовать метод GetProfileDataAsync на службе IProfileService, чтобы добавить некоторые утверждения.

Поэтому при запуске убедитесь, что у вас есть что-то вроде:

identityServerBuilder.Services.AddScoped<IProfileService, ProfileService>();

А затем в вашем ProfileService классе есть что-то вроде этого:

public Task GetProfileDataAsync(ProfileDataRequestContext context) {
    context.IssuedClaims.Add(new Claim()); //Your claims(s)
}