循环ReturnUrlParsers时为Null参考

时间:2018-09-20 08:37:26

标签: identityserver4

我创建了一个自定义返回URL解析器,以确定哪个租户正在调用登录页面,但是在加载登录页面时,在其中一个returnUrlparsers上获得了空引用。

  

在IdentityServer4.Services.ReturnUrlParser.ParseAsync(String returnUrl)在C:\ local \ identity \ server4 \ IdentityServer4 \ src \ IdentityServer4 \ Services \ ReturnUrlParser.cs:第38行       在IdentityServer4.Services.DefaultIdentityServerInteractionService.GetAuthorizationContextAsync(String returnUrl)中的C:\ local \ identity \ server4 \ IdentityServer4 \ src \ IdentityServer4 \ Services \ DefaultIdentityServerInteractionService.cs:IdentityServer4.Quickstart.UI.AccountController.BuildLoginViewModelAsync(String 54)在D:\ git \ identity-server \ IdentityServer4 \ src \ Fifthplay.IdentityServer4 \ 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);
    }

将其注册到DI

  services.AddTransient<IReturnUrlParser, MyReturnUrlParser>();

加载登录页面后,我看到点击了“ MyReturnUrlparser”,由于它只是在浏览,它返回一个null到登录页面,但是随后抛出了一个null引用。

https://github.com/IdentityServer/IdentityServer4/blob/c2255fae51ecac3048f7281fc7590bee085f30f2/src/Services/Default/ReturnUrlParser.cs

我的下一个猜测是,由于某些原因,当遍历所有可用的ReturnUrl解析器时,默认URL解析器为null。有没有人经历过这种行为?还是我缺少明显的东西?

1 个答案:

答案 0 :(得分:1)

默认URL解析器不能为null,因为在ReturnUrlParser.cs的第36行上会有NullReferenceException

if (parser.IsValidReturnUrl(returnUrl))

您是否粘贴了整个堆栈跟踪? 是否在“ ParseAsync”方法内引发了异常?

一种可能性是,URL解析器正在返回true以获取不应处理的URL,并且由于遇到意外情况而陷入ParseAsync内部。我注意到您总是从true返回IsValidReturnUrl,这意味着您的URL解析器将解析所有URL。

您可以尝试移动注册行:

services.AddTransient<IReturnUrlParser, MyReturnUrlParser>();

在调用services.AddIdentityServer()之前,以便您的解析器位于解析器集合的首位:

enter image description here