gpt4 book ai didi

c# - IdentityServer4 - 缺少来自 Google 的声明

转载 作者:行者123 更新时间:2023-12-03 18:46:10 25 4
gpt4 key购买 nike

TLDR; 在使用 IdentityServer4 的上下文中

  • 您如何从 Google 获得电子邮件地址和高清声明?
  • 你如何让 User.Identity.Name 被填充?


  • 我已经通过 IdentityServer quickstarts并让 MVC 客户端与 IdentityServer 实例对话(如果使用了错误的术语,请致歉)。我正在使用外部身份验证(Google)并且没有任何稍微复杂的东西,例如本地登录/数据库等。我没有使用 ASP.NET 身份。这一切都很好。

    我可以在我的 MVC 应用程序中成功进行身份验证,并且以下代码会在下面的屏幕截图中生成声明:
    @foreach (var claim in User.Claims)
    {
    <dt>@claim.Type</dt>
    <dd>@claim.Value</dd>
    }
    <dt>Identity.Name</dt>
    <dd>&nbsp;@User.Identity.Name</dd>

    <dt>IsAuthenticated</dt>
    <dd>@User.Identity.IsAuthenticated</dd>

    enter image description here

    问题:
  • 我无法从 Google 检索额外的声明(正确的术语?)。特别是“高清”甚至“电子邮件”——请注意,它们没有出现在上面屏幕截图的声明中。如何从 Google 获取电子邮件地址和高清声明?我错过了什么或做错了什么?
  • 请注意,User.Identity.Name 的输出为空。为什么会这样以及如何填充?这似乎是唯一未设置的 User.Identity 属性。


  • 我的设置如下 - 你可以看到上面的输出:

    客户端 (MVC)

    在 Startup.cs 中,ConfigureServices
    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

    services.AddAuthentication(options =>
    {
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
    })
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
    options.SignInScheme = "Cookies";
    options.Authority = Configuration["App:Urls:IdentityServer"];
    options.RequireHttpsMetadata = false;
    options.Resource = "openid profile email";
    options.Scope.Add("openid");
    options.Scope.Add("profile");
    options.Scope.Add("email");
    options.Scope.Add("domain");
    options.ClientId = "ctda-web";
    options.SaveTokens = true;
    options.GetClaimsFromUserInfoEndpoint = true;
    });

    身份服务器

    客户端定义
    // OpenID Connect implicit flow client (MVC)
    new Client
    {
    ClientId = "ctda-web",
    ClientName = "Company To Do Web App",
    AllowedGrantTypes = GrantTypes.Implicit,
    EnableLocalLogin = false,

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

    // where to redirect to after logout
    PostLogoutRedirectUris = { "http://localhost:53996/signout-callback-oidc" },

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

    身份资源定义
    return new List<IdentityResource>
    {
    new IdentityResources.OpenId(),
    new IdentityResources.Profile(),
    new IdentityResources.Email(),
    new IdentityResource
    {
    Name = "domain",
    DisplayName = "Google Organisation",
    Description = "The hosted G Suite domain of the user, if part of one",
    UserClaims = new List<string> { "hd"}
    }
    };

    最佳答案

    答案出奇地不明显:只要您具有以下配置(在 Identity Server Startup.cs 中),IdentityServer4 提供的示例代码就可以工作:

    services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(Config.GetApiResources())
    .AddInMemoryIdentityResources(Config.GetIdentityResources())
    .AddInMemoryClients(Config.GetClients()
    .AddTestUsers(Config.GetUsers()); //<--- this line here

    为什么?因为 AddTestUsers 正在做一堆 the plumbing你需要在你自己的世界里做。该演练隐含地假设您迁移到 EF 或 ASP.NET Identity 等,并且不清楚如果您不打算使用这些数据存储,您必须做什么。简而言之,您需要:
  • 创建一个对象来代表用户(here's a starter)
  • 创建一个持久性/查询类(here's a starter)
  • 创建一个 IProfileService 实例,将这一切联系在一起,放入您对 User 和 UserStore ( here's a starter )
  • 的定义
  • 添加适当的绑定(bind)等

  • 我的 IdentityServer Startup.cs 最终看起来像这样(我想故意在内存中做,但显然不使用示例中提供的测试用户):
    services.AddSingleton(new InMemoryUserStore()); //<-- new

    services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiResources(Config.GetApiResources())
    .AddInMemoryIdentityResources(Config.GetIdentityResources())
    .AddInMemoryClients(Config.GetClients())
    .AddProfileService<UserProfileService>(); //<-- new

    事实证明,谷歌确实将电子邮件作为 claim 的一部分返回。问题代码示例中的范围有效。

    关于c# - IdentityServer4 - 缺少来自 Google 的声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133282/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com