我一直在尝试使用这里提到的代码:
https://stackoverflow.com/a/35882775/7440281
......作为解决自己问题的一种方式。基本上我想要做的事 - 最初无论如何 - 调用某种函数并为其提供用户名和密码。验证将在外部完成,但已添加到我的ResourceOwnerPasswordValidator实例中。请注意,界面似乎在写入时和当前之间发生了变化。我作为第一步所做的就是检查一个特定的名字,试着让事情变得简单。这是我班级的当前内容:
public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
if (context.UserName == "PatrickS")
{
var result = new GrantValidationResult("PatrickS", "password");
}
else
{
var result = new GrantValidationResult(TokenRequestErrors.UnauthorizedClient, "Username Or Password Incorrect");
}
return Task.FromResult(result);
}
}
我在评论中定义了注释中提到的两个接口。我也使用services.AddTransient()在ConfigureServices中引用它们。问题是我目前得到的只是'unauthorised_client'。
这可能是也可能不是客户端的配置。这来自相关客户端的设置:
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
RedirectUris = { "http://localhost:5002/signin-oidc" },
PostLogoutRedirectUris = { "http://localhost:5002" },
RedirectUris之前已被设置为快速入门教程的一部分。我猜这应该改成别的东西,但不清楚它应该是什么。我还不清楚AllowedGrantTypes是否已正确设置。当然可能还有其他事情,但我仍然是Identityserver的新手。
答案 0 :(得分:0)
是的,问题无疑与您的客户端定义或您调用connect/token
端点的方式有关。
在发布到connect/token
端点的帖子中,请确保提供:
- grant_type(在您的情况下为'password')
- client_id
- 用户名
- 密码
- 范围
- 秘密(如果您在客户定义中要求
在您定义客户端的IdentityServer中,确保您使用的client_id已定义:
AllowedGrantTypes
(与请求的grant_type匹配)RequireClientSecret
(true / false,如果为true则需要发布)并使用ClientSecrets
AllowedScopes
(以匹配要求的范围)您如何测试IdServer端点? Postman是一个有用的工具,用于保持简单并消除客户端本身的任何潜在问题。
如果您使用GrantType.ResourceOwnerPassword
,那么您不需要(也不能使用)重定向网址。