我正在尝试使用IdentityServer,并且一直在密切关注readthedocs上的指南。我正在添加外部身份提供者,并且已经将我想要支持的所有身份提供者添加到IdentityServer项目中。
我特别希望包括“公会”从Discord然后做基于角色的授权在我的网页应用程序中的基础上的角色,用户在一个特定的公会。Discord列出了各种范围,允许:
因此,我包含了AspNet.Security.OAuth.Discord包,并为公会添加了一个IdentityResource:
public static class AuthConfig
{
public static IEnumerable<IdentityResource> IdentityResources =>
new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Address(),
new IdentityResources.Email(),
new IdentityResources.Profile(),
new IdentityResource()
{
Name = "guilds",
DisplayName = "Discord Guilds",
Description = "All of the Discord Guilds the user belongs to",
Required = true,
Emphasize = true,
UserClaims = new[] { "name" } // <<< Not sure how I find the claims on the discord api doco
}
};
.
.
.
}
这允许我在启动IdentityServer项目时向discord选项添加作用域:
public void ConfigureServices(IServiceCollection services)
{
// uncomment, if you want to add an MVC-based UI
services.AddControllersWithViews();
services.AddAuthentication()
.AddDiscord("Discord", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
options.ClientId = "<my client id>";
options.ClientSecret = "<my client secret>";
options.Scope.Add("guilds");
})
当我登录的时候,uri已经添加了guild作用域,并且我在确认对话框中得到警告:
但是当我查看我的声明的内容时,我什么都看不到。如果我添加一个标准的oidc,其中一个 email 会显示。
如果我一直遵循IdentityResources.Email
的定义,则会看到这些声明定义在IdentityServer4.Constants
中的ScopeToClaimsMapping
属性上
但我不确定如何确定Discord guilds
示波器的这些声明......无论如何,这是问题所在吗?
谁能给我指个方向?
1条答案
按热度按时间shstlldc1#
声明和作用域是不同但相关的事物。
作用域是一个声明,它讨论访问的作用域。
当您请求“guild”作用域时,这意味着您的令牌将能够访问该作用域下的信息,但这并不一定意味着信息将出现在令牌或user_info响应的声明中。
相反,要获取“公会”信息,您需要使用令牌来使用它们的API。
Discord开发者门户-公会
获取当前用户公会
GET /用户/@我/公会
返回当前用户所属的部分公会对象列表。
需要公会OAuth2范围。