Identityserver4 循环ReturnUrlParser时的空引用

Identityserver4 循环ReturnUrlParser时的空引用,identityserver4,Identityserver4,我已经创建了一个自定义返回url解析器来确定哪个租户正在调用登录页面,但是当加载登录页面时,我在其中一个返回url解析器上得到一个空引用 在C:\local\identity\server4\IdentityServer4\src\IdentityServer4\Services\ReturnUrlParser.ParseAsync(字符串returnUrl)中的IdentityServer4.Services.ReturnUrlParser.ParseAsync处:第38行 在C:\local

我已经创建了一个自定义返回url解析器来确定哪个租户正在调用登录页面,但是当加载登录页面时,我在其中一个返回url解析器上得到一个空引用

在C:\local\identity\server4\IdentityServer4\src\IdentityServer4\Services\ReturnUrlParser.ParseAsync(字符串returnUrl)中的IdentityServer4.Services.ReturnUrlParser.ParseAsync处:第38行 在C:\local\identity\server4\IdentityServer4\src\IdentityServer4\Services\DefaultIdentityServerInteractionService.cs中的IdentityServer4.Services.DefaultIdentityServerInteractionService.GetAuthorizationContextAsync(字符串返回URL)中:IdentityServer4.Quickstart.UI.AccountController.BuildLoginViewModelAsync(字符串返回URL)第54行在D:\git\identity server\identity server 4\src\Fifthplay.identity server 4\Quickstart\Account\AccountController.cs中:第346行

我已经创建了IReturnUrlParser的自定义实现

 public class MyReturnUrlParser: IReturnUrlParser
{
    private IdentityServerConfigurationContext _identityServicecontext { get; set; }
    private ILogger<MyReturnUrlParser> _logger;
    public MyReturnUrlParser(IdentityServerConfigurationContext context, ILogger<MyReturnUrlParser> logger)
    {
        _identityServicecontext = context;
        _logger = logger;
    }

    public bool IsValidReturnUrl(string returnUrl)
    {
        return true;
    }

    public Task<AuthorizationRequest> ParseAsync(string returnUrl)
    {
        if(string.IsNullOrEmpty(returnUrl))
            return null;

        ... doing some custom stuff 

        return Task.FromResult(authorizationRequest);
    }
公共类MyReturnUrlParser:IReturnUrlParser
{
私有标识服务器配置上下文_标识服务上下文{get;set;}
私人ILogger_记录器;
公共MyReturnUrlParser(IdentityServerConfigurationContext,ILogger记录器)
{
_identityServicecontext=上下文;
_记录器=记录器;
}
public bool IsValidReturnUrl(字符串返回URL)
{
返回true;
}
公共任务


我的下一个猜测是,由于某种原因,在所有可用的ReturnUrl解析器中循环时,默认URL解析器为null。以前有人经历过这种行为吗?或者我遗漏了什么明显的东西吗?

默认URL解析器不能为null,因为您可能会在ReturnUrlParser.cs的第36行出现
NullReferenceException

if (parser.IsValidReturnUrl(returnUrl))
是否粘贴了整个堆栈跟踪?是否在“ParseAsync”方法中引发异常

一种可能性是,URL解析器返回不应处理的URL的
true
,并在
ParseAsync
中掉落,因为它遇到了意外情况。我注意到,您总是从
IsValidReturnUrl
返回
true
,这意味着您的URL解析器将解析所有URL网址

您可以尝试移动您的注册行:

services.AddTransient<IReturnUrlParser, MyReturnUrlParser>();
services.AddTransient();
在调用
services.AddIdentityServer()
之前,使您的解析器位于解析器集合的第一位:


什么是IdentityServerConfigurationContext?构造MyReturnUrlParser时如何创建它?这是一个用于查询IdentityServer数据库的DbContext。IdentityServerConfigurationContext的实例已向DI注册?
services.AddTransient<IReturnUrlParser, MyReturnUrlParser>();