- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个使用 ResourceOwnerPassword
授权类型的基本登录流程。用户可以登录、验证密码并获得可用于访问 API 的 token 。我现在正试图将声明传递回客户端,以便我可以确定我正在处理的用户类型,但我收到一个错误,我认为这是客户端范围的问题(尽管我看不到什么)。
下面的代码被删节以避免一页又一页的代码,但我相信它包含了所有相关的内容。这是身份服务器设置:
services
.AddIdentityServer()
.AddInMemoryClients(IdentityServerHelper.GetClients())
.AddInMemoryApiResources(IdentityServerHelper.GetApiResources())
.AddTestUsers(IdentityServerHelper.GetUsers())
.AddInMemoryIdentityResources(
IdentityServerHelper.GetIdentityResources());
辅助方法:
internal static IEnumerable<Client> GetClients()
{
var clients = new List<Client>
{
new Client
{
ClientId = "MyClientApp",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes =
{
"myApi",
"Role",
IdentityServerConstants.StandardScopes.OpenId
/*
IdentityServerConstants.StandardScopes.Profile
*/
}
}
};
}
internal static IEnumerable<IdentityResource> GetIdentityResources()
{
return new List<IdentityResource> {
new IdentityResource {
Name = "Role",
UserClaims = new List<string> { JwtClaimTypes.Role },
}
};
}
internal static List<TestUser> GetUsers()
{
var users = new List<TestUser>
{
new TestUser
{
SubjectId = Guid.NewGuid(),
Username = "user",
Password = "pass",
Claims = new List<Claim>()
{
new Claim(JwtClaimTypes.Role, "Role1")
}
},
思路是将Role1
返回给客户端。这是客户端代码:
_discoveryResponse = await _httpClient.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest
{
Address = "https://localhost:5021",
Policy =
{
ValidateIssuerName = false,
}
});
var response = await _httpClient.RequestPasswordTokenAsync(new PasswordTokenRequest
{
Address = _discoveryResponse.TokenEndpoint,
ClientId = "MyClientApp",
ClientSecret = "secret",
Scope = "openid Role myApi",
UserName = username,
Password = password
});
if (response.IsError)
{
return false; // When specifying openid, get invalid scope here
}
_accessToken = response.AccessToken;
. . .
var userInfo = await _httpClient.GetUserInfoAsync(new UserInfoRequest()
{
Address = _discoveryResponse.UserInfoEndpoint,
Token = _accessToken
});
// userInfo is returning "Forbidden" here.
编辑:
在范围内指定 openid 时,Identity Server 日志中出现以下错误:
fail: IdentityServer4.Validation.ScopeValidator[0] Requested scope not allowed: openid
最佳答案
请求 token 时至少需要添加 openid
范围。像下面这样更改代码可能会解决问题。
var clients = new List<Client>
{
new Client
{
ClientId = "MyClientApp",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes =
{
"myApi",
"Role",
IdentityServerConstants.StandardScopes.OpenId
}
}
};
var response = await _httpClient.RequestPasswordTokenAsync(new PasswordTokenRequest
{
Address = _discoveryResponse.TokenEndpoint,
ClientId = "MyClientApp",
ClientSecret = "secret",
Scope = "openid Role myApi",
UserName = username,
Password = password
});
关于c# - 如何从 IdentityServer4 请求用户信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53986152/
在登录并同意后使用任何标准身份提供者(谷歌、Facebook)时,他们会重定向到我的主要身份服务器,并让它重定向到在其中注册的隐式客户端。我如何使用另一个身份服务器作为外部身份提供者实现相同的行为?
我正在开发一个 SPA Web 应用程序,并且我正在使用 IdentityServer4 代码流来处理授权。所以我有以下组件: Angular 客户端应用程序,https://localhost:50
我正在设置 IdentityServer 的一个新实例作为身份提供者。登录时,我想在我的用户对象上设置一些额外的自定义声明。现在,我正在使用以下代码: [HttpPost] public async
我正在尝试遵循本指南 https://identityserver.github.io/Documentation/docs/advanced/customizingViews.html通过将 ass
当使用 IdentityServer 3 时签名证书(用于签名 jwt token )过期会发生什么? 我不清楚,我找不到任何文档,除了可能会收到它已过期的警告。 (Ref. https://iden
我有一个使用 IdentityServer4 进行 token 验证的 API。 我想使用内存中的 TestServer 对这个 API 进行单元测试。我想在内存中的 TestServer 中托管 I
我正在尝试将 Identity Server 4 与 Ocelot 集成并对 WebApp (asp.net core 3.1) 进行身份验证,然后在请求通过身份验证时访问 api。 为此我创建了一个
如果您有多个客户端和一个处理用户身份验证的中央 IdentityServer 4 实例,您将如何管理各个客户端的用户配置文件? 当前情况: 用户点击“管理个人资料” 用户被重定向到 IdentityS
我正在开发一个带有 angular 的前端应用程序和一个带有 Asp.Net Core 的后端应用程序,其中包含用于身份验证的 IdentityServer4(基于此 github project)。
我有一个包含用户的数据库,我该如何开始使用 IdentityServer 创建我的用户的自定义实现?我看到的所有示例都使用了用值硬编码的 InMemoryUser。 有人可以关注this作为指南? 最
我们公司有一个 SSO 应用程序,我希望用 IdentityServer4 或 3 替换大部分身份验证管道。我要替换的版本有自己的动态客户端注册自定义实现(不符合规范)和一个 UI 来管理它。 有nu
我正在使用 IdentityServerV3 对少数客户端的用户进行身份验证。我在配置 IdentityServer 时遇到问题,特定的 user 必须能够登录到特定的“客户端”。 让我们来看下面的场
目前我们正在使用 JWT token 进行身份验证(有效),但我想使用引用 token 。目前我们的配置是这样的: public static class Config { ///
我在启动 IdentityServer 3 时遇到问题。这是一个非常简单的设置,我打算将其用于开发环境,但我在诊断问题时遇到了问题。这是我的代码: Startup.cs using Owin;
我正在使用来自 IdentityServer 4 实例的 OAuth2。基于this example ,我能够登录并调用服务器托管的 API。 如何在不显示提示用户确认注销的 Web View 的情况
我是 IdentityServer 3 的新手,示例和教程使用的是 InMemory 用户、客户端和范围,但我需要这些来自 DB。所以我做了: 启动.cs public void Configurat
我一直在阅读和观看有关 Identity Server 4 的大量内容,但我仍然对它感到有些困惑,因为它似乎有太多的事件部分。 我现在明白这是一个单独的项目,它负责对用户进行身份验证。我仍然不明白的是
我似乎无法理解为什么我会从 IdentityServer 获得 unauthorized_client。我将 oidc-client 与 Angular 4 ui 和 Web API 的 asp.ne
我在 IdentityServer 中设置了以下客户端: new Client { ClientName = "My web application", Enabled = true,
在本地,我有一组 Web 应用程序都可以通过一次登录访问。 为此,我采用了 Identity Server 4。 一旦应用程序发布在本地服务器上,无法远程访问,我就通过 openssl 生成了一个 S
我是一名优秀的程序员,十分优秀!