Identity Server: добавление утверждений в ClaimPrincipal с помощью гибридного потока в клиенте MVC - PullRequest
0 голосов
/ 11 июня 2018

Я настраиваю сервер идентификации и не могу понять, почему я не могу получить доступ к недавно добавленной заявке с моего сайта MVC.

Я использую пример быстрого запуска № 5: ( Ссылка на github) со следующими изменениями на сервере идентификации:

public static IEnumerable<IdentityResource> GetIdentityResources()
    {
        return new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
            **new IdentityResource
            {
                Name = JwtClaimTypes.Role,
                DisplayName = JwtClaimTypes.Role,
                UserClaims = { JwtClaimTypes.Role }
            }**
        };
    }

public static IEnumerable<Client> GetClients()
    {
        // client credentials client
        return new List<Client>
        {
            new Client
            {
                ClientId = "mvc",
                ClientName = "MVC Client",
                AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

                ClientSecrets = 
                {
                    new Secret("secret".Sha256())
                },

                RedirectUris = { "http://localhost:5002/signin-oidc" },
                PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },

                AllowedScopes = 
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    "api1",
                    **JwtClaimTypes.Role**
                },
                AllowOfflineAccess = true
            }
        };
    }

public static List<TestUser> GetUsers()
    {
        return new List<TestUser>
        {
            new TestUser
            {
                SubjectId = "1",
                Username = "alice",
                Password = "password",

                Claims = new List<Claim>
                {
                    new Claim("name", "Alice"),
                    new Claim("website", "https://alice.com"),
                    **new Claim(JwtClaimTypes.Role, "Admin")**
                }
            }
        };
    }

И со следующими изменениями в проекте mvc

.AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
                **options.Scope.Add(JwtClaimTypes.Role);**
            });

Пока я не вижу заявки на роль впретензии на ClaimsPrincipal в приложении MVC.Я уверен, что что-то мне не хватает.Я могу добавить претензию к своему методу доступа и найти его там.Я также пытался внедрить ProfileService, чтобы добавить туда заявку, но все равно не смог найти ее в ClaimsPrincipal после входа в систему. Просьба просветить меня =)

Служба моего профиля:

 public Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var user = Config.GetUsers().First();
            var claims = new List<Claim>
            {
                new Claim(JwtClaimTypes.Role, "Admin"),
            };

            context.IssuedClaims.AddRange(claims);

            return Task.FromResult(0);
        }

1 Ответ

0 голосов
/ 12 июня 2018

Хорошо, поэтому я нашел ответ в этой теме https://github.com/aspnet/Security/issues/1449

Короче говоря: в .net core 2.0, чтобы избежать раздувания cookie, необходимо сопоставлять заявки вручную с помощью действия по заявкам.

Исправление выглядит так:

.AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = "Cookies";

            options.Authority = "http://localhost:5000";
            options.RequireHttpsMetadata = false;

            options.ClientId = "mvc";
            options.ClientSecret = "secret";
            options.ResponseType = "code id_token";

            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;

            options.Scope.Add("api1");
            options.Scope.Add("offline_access");
            **options.Scope.Add(JwtClaimTypes.Role);**
            **options.ClaimActions.MapJsonKey(JwtClaimTypes.Role, JwtClaimTypes.Role);**
        });
...