无效的redirect_uri即使它们相同

时间:2019-05-27 09:14:05

标签: identityserver4

尝试登录到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

3 个答案:

答案 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”

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-3.0#other-configuration-options