IdentityServer 4 - Добавление пользовательского утверждения для пользователя при использовании типа неявного предоставления - PullRequest
0 голосов
/ 07 декабря 2018

Я прохожу учебник по IdentityServer 4, где объясняется, как добавить аутентификацию пользователя с OpenID Connect, его можно найти здесь:

http://docs.identityserver.io/en/latest/quickstarts/3_interactive_login.html

В основном в этом учебникеу нас есть приложение MVC с действием контроллера, украшенным атрибутом Authorized.Каждый раз, когда пользователь пытается получить доступ к этому действию, в случае, если он / она не вошел в систему, приложение MVC перенаправляет пользователя на Identity Server, чтобы он / она мог ввести учетные данные для входа.Если учетные данные верны, Identity Server перенаправляет обратно в приложение MVC, где отображается страница с учетными данными пользователя.Я завершил урок, и теперь я хочу исследовать немного больше, добавляя новые требования к токену, но пока не добился успеха.В учебном пособии области OpenId и Profile добавляются путем настройки AllowedScopes в конфигурации клиента.Я попытался создать «возрастную» область и добавить ее таким же образом, но это не сработало.У кого-нибудь есть идеи, как я могу это сделать?Код показан ниже (закомментированные строки - это то, что я уже пробовал).

Настройка IdentityServer:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // configure identity server with in-memory stores, keys, clients and scopes
    services.AddIdentityServer()
        .AddDeveloperSigningCredential()
        .AddInMemoryIdentityResources(Config.GetIdentityResources())
        .AddInMemoryClients(Config.GetClients())
        .AddTestUsers(Config.GetUsers());
}

В конфигурации хранилищ памяти:

public class Config
{
    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>()
        {
            new Client
            {
                ClientId = "mvc",
                ClientName = "MVC Client",
                AllowedGrantTypes = GrantTypes.Implicit,

                // where to redirect to after login
                RedirectUris = { "http://localhost:5002/signin-oidc" },

                // where to redirect to after logout
                PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
                RequireConsent = false,
                //AlwaysIncludeUserClaimsInIdToken = true,
                //AlwaysSendClientClaims = true,
                //AllowAccessTokensViaBrowser = true,

                AllowedScopes = new List<string>
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "age"
                }
            }
        };
    }

    public static List<TestUser> GetUsers()
    {
        return new List<TestUser>()
        {
            new TestUser()
            {
                SubjectId = "1",
                Username = "alice",
                Password = "password",
                Claims = new List<Claim>()
                {
                    new Claim("age", "15"),
                    new Claim("name", "Alice"),
                    new Claim("website", "https://alice.com")
                }
            },

            new TestUser()
            {
                SubjectId = "2",
                Username = "bob",
                Password = "password",
                Claims = new List<Claim>()
                {
                    new Claim("age", "16"),
                    new Claim("name", "Bob"),
                    new Claim("website", "https://bob.com")
                }
            }
         };
     }

     public static IEnumerable<IdentityResource> GetIdentityResources()
     {
        return new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
            new IdentityResource()
            {
                DisplayName = "Age",
                Name = "age",
                UserClaims = new List<string>()
                {
                    "age"
                }
            }
        };
    }
}

Настройка приложения MVC:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore()
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies";
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;

        options.ClientId = "mvc";
        options.SaveTokens = true;
    });

}

Страница заявок на приложения MVC:

<dl>
    @foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }
</dl>

Это результат успешного входа в систему:

sid ba7ecb47f66524acce04e321b8d2c444

sub 2

idp local

name Bob

website https://bob.com

Как видите, в профиле отображаются претензии (имя и сайт), но пользовательские "возраст "претензий не имеет.

1 Ответ

0 голосов
/ 07 декабря 2018

Ответ на первоначальный вопрос заключается в явном добавлении утверждений, которые мы хотим использовать при настройке OpenId Connect.Мы добавим следующие строки в метод .AddOpenIdConnect:

options.Scope.Clear();
options.Scope.Add("age");

Полная настройка показана ниже:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcCore()
        .AddRazorViewEngine()
        .AddAuthorization()
        .AddJsonFormatters();

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
    {
        options.DefaultScheme = "Cookies";
        options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies";
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;
        options.ClientId = "mvc";
        options.SaveTokens = true;

        options.Scope.Clear();
        options.Scope.Add("age");
        //Add all the claims you need
    });
}
...