尝试登录到Identityserver(使用.net core 3预览)时,即使请求uri和允许的URI相同,我也会收到Invalid redirect_uri错误。
我还能做错什么?
fail: IdentityServer4.Validation.AuthorizeRequestValidator[0]
Invalid redirect_uri: http://localhost:1337/authentication/login-callback
{
"ClientId": "myapp",
"ClientName": "myapp",
"AllowedRedirectUris": [
"http://localhost:1337/authentication/login-callback"
],
"SubjectId": "anonymous",
"RequestedScopes": "",
"Raw": {
"client_id": "myapp",
"redirect_uri": "http://localhost:1337/authentication/login-callback",
"response_type": "id_token token",
"scope": "webAPI openid profile",
"state": "5a10fc5a7006475c8d3a348c711ca58a",
"nonce": "ae6f9f35837241e1ba3841c2ff8a4fce",
"prompt": "none"
}
}
fail: IdentityServer4.Endpoints.AuthorizeEndpoint[0]
Request validation failed
答案 0 :(得分:1)
我想为需要进一步解释的人员添加一个补充,即这不适用于IdentityServerSPA
客户类型的原因是这样的事实,当您这样呼叫AddApiAuthorization
时:
services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser, ApplicationDbContext>();
库代码从文件IdentityServerBuilderConfigurationExtensions.cs第65行运行此操作:
builder.AddAspNetIdentity<TUser>()
.AddOperationalStore<TContext>()
.ConfigureReplacedServices() // <-- This is the line
.AddIdentityResources()
.AddApiResources()
.AddClients()
.AddSigningCredentials();
ConfigureReplacedServices
会这样做:
builder.Services.AddSingleton<IRedirectUriValidator, RelativeRedirectUriValidator>();
然后RelativeRedirectUriValidator
通过首先检查客户端类型是否为IdentityServerSPA
来验证重定向URI,因此:
public override Task<bool> IsRedirectUriValidAsync(string requestedUri, Client client)
{
if (IsLocalSPA(client))
{
return ValidateRelativeUris(requestedUri, client.RedirectUris);
}
else
{
return base.IsRedirectUriValidAsync(requestedUri, client);
}
}
这样定义了IsLocalSPA
时:
private static bool IsLocalSPA(Client client) =>
client.Properties.TryGetValue(ApplicationProfilesPropertyNames.Profile, out var clientType) &&
ApplicationProfiles.IdentityServerSPA == clientType;
我添加此答案既可以帮助他人,也可以帮助自己更好地理解:)
答案 1 :(得分:1)
这可能不是一个相同的问题(我在这里远不是专家)。但是我确实遇到了同样的问题,这使我找到了这篇文章。
在我的情况下,发现问题是返回网址上缺少尾随/。这个github问题触发了我:https://github.com/dotnet/aspnetcore/issues/21167。敬请期待杰夫·施拉格(JefSchraag)在2020年5月1日发表的评论。
我的客户项目中RedirectToLogin.razor组件中的此修改似乎解决了该问题。
protected override void OnInitialized()
{
var returnUrl = Navigation.Uri;
if (!returnUrl.EndsWith('/'))
{
returnUrl += '/';
}
Navigation.NavigateTo($"authentication/login?returnUrl={returnUrl}");
}
答案 2 :(得分:0)
我在核心3的新身份服务器功能中使用了错误的配置文件。正在使用“ IdentitySpa”-应该是“ SPA”