Невозможно получить утверждение name от IdentittyServer4, когда клиент записан в. NET Framework - PullRequest
0 голосов
/ 19 июня 2020

Я аутентифицирую пользователя на сайте ASP. NET (. NET Framework) с помощью IdentityServer4 (отдельное приложение, написанное на. NET Core).

Все работает нормально, но name претензия никогда не возвращается.

Если клиент был записан в. NET Core, похоже, есть это свойство GetClaimsFromUserInfoEndpoint (сборка Microsoft.AspNetCore.Authentication.OpenIdConnect, Version=3.1.3.0):

        services
            .AddAuthentication(options =>
            {
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
            {
                options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                options.Authority = Configuration["AppSettings:IdentityServerUrl"];
                options.RequireHttpsMetadata = true;

                options.ClientId = Configuration["AppSettings:ClientId"];
                options.ClientSecret = Configuration["AppSettings:ClientSecret"];
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true; // <<<<<<<<<<<---
            ....

Однако в. NET Framework у меня такого свойства нет. Все, что у меня есть, это этот код (сборка расширения: Microsoft.Owin.Security.OpenIdConnect v3.1.0.0):

        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
        {
            AuthenticationType = "oidc",
            SignInAsAuthenticationType = "Cookies",
            Authority = identityServerUrl,
            RedirectUri = appUrl + "/signin-oidc",
            PostLogoutRedirectUri = appUrl + "/signout-callback-oidc",
            ClientId = "clientId",
            ClientSecret = @"secret",
            ResponseType = OpenIdConnectResponseTypes.CodeIdToken,
            Scope = "openid profile offline_access",
            UseTokenLifetime = false,
        });

Я пробовал разные вещи на клиенте и на сервере идентификации, но, похоже, ничего не помогает.

Может ли кто-нибудь сказать мне, как я могу получить это утверждение внутри моего токена?

Я получаю другие утверждения, но, похоже, он пропускает вызов конечной точки информации о пользователе на IdentityServer, и поэтому этого утверждения пользователя там нет.

Ответы [ 2 ]

1 голос
/ 24 июня 2020

Вы можете попробовать добавить это к своему клиенту, чтобы исправить сопоставление между тем, что Microsoft считает именем, и тем, что Identity Server считает заявлением на имя.

options.TokenValidationParameters = new TokenValidationParameters
{
    NameClaimType = JwtClaimTypes.Name,
    RoleClaimType = JwtClaimTypes.Role,
};
1 голос
/ 19 июня 2020

Необходимо реализовать интерфейс IPorfileService для. NET

читать: http://docs.identityserver.io/en/latest/reference/profileservice.html

и: https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2013/dn277201 (v% 3Dvs.120 )

Надеюсь, это вам поможет! :)

Позднее редактировать:

 var oidcOptions = new OpenIdConnectAuthenticationOptions
       {
           Authority = OidcAuthority,
           ClientId = OidcClientId,
           ClientSecret = OidcClientSecret,

          GetClaimsFromUserInfoEndpoint = true,

           PostLogoutRedirectUri = OidcRedirectUrl,
           RedirectUri = OidcRedirectUrl,
           ResponseType = OpenIdConnectResponseType.Code,
           Scope = OpenIdConnectScope.OpenId
       };
       app.UseOpenIdConnectAuthentication(oidcOptions);
...