Ссылка Null при цикле ReturnUrlParsers - PullRequest
0 голосов
/ 20 сентября 2018

Я создал собственный анализатор URL-адреса возврата, чтобы определить, какой клиент вызывает страницу входа, но при загрузке страницы входа я получаю нулевую ссылку на один из returnUrlparsers.

в IdentityServer4.Services.ReturnUrlParser.ParseAsync (String returnUrl) в C: \ local \ identity \ server4 \ IdentityServer4 \ src \ IdentityServer4 \ Services \ ReturnUrlParser.cs: строка 38 в IdentityServices.DefaultIdentityServerInteractionService.GetAuthorizationContextAsync (String returnUrl) в C: \ local \ identity \ server4 \ IdentityServer4 \ src \ IdentityServer4 \ Services \ DefaultIdentityServerInteractionService.cs: строка 54 в IdentitySeritInIUIU.INDIU.INC\ 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» ударил, он возвращает ноль, потому что он просто просматривает страницу входа, но затем нулевую ссылкуброшен

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

Следующее мое предположение заключается в том, что по какой-то причине парсер URL по умолчанию является нулевым при циклическом просмотре всех доступных парсеров ReturnUrl.Кто-нибудь испытывал такое поведение раньше?Или я что-то упускаю очевидное?

1 Ответ

0 голосов
/ 20 сентября 2018

Парсер URL по умолчанию не может быть нулевым, потому что вы получили бы NullReferenceException в строке 36 в ReturnUrlParser.cs:

if (parser.IsValidReturnUrl(returnUrl))

Вставили ли вы всю трассировку стека?Вызывается ли исключение внутри метода `ParseAsync '?

Одна из возможностей состоит в том, что анализатор URL возвращает true для URL, который он не должен обрабатывать, и падает внутри ParseAsync, потому что онстолкнуться с чем-то неожиданным.Я заметил, что вы всегда возвращаете true из IsValidReturnUrl, что означает, что ваш анализатор URL будет анализировать все URL.

Вы можете попробовать переместить строку регистра:

services.AddTransient<IReturnUrlParser, MyReturnUrlParser>();

довызовите services.AddIdentityServer(), чтобы ваш парсер был первым в коллекции парсеров:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...