我创建了一个自定义返回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引用。
我的下一个猜测是,由于某些原因,当遍历所有可用的ReturnUrl解析器时,默认URL解析器为null。有没有人经历过这种行为?还是我缺少明显的东西?
答案 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()
之前,以便您的解析器位于解析器集合的首位: