.NET Core身份登录页面处理程序OnGetAync()

时间:2020-03-15 19:40:22

标签: c# asp.net-core asp.net-core-identity

我正在使用Identity进行.NET Core 3.1项目。在Login.cs.html页面上,OnGetAsync()页面处理程序如下:

public async Task OnGetAsync(string returnUrl = null)
{
    if (!string.IsNullOrEmpty(ErrorMessage))
    {
        ModelState.AddModelError(string.Empty, ErrorMessage);
    }

    returnUrl = returnUrl ?? Url.Content("~/");

    // Clear the existing external cookie to ensure a clean login process
    await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

    ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync())
        .ToList();

    ReturnUrl = returnUrl;
}

我对代码returnUrl = returnUrl ?? Url.Content("~/");的行以及为什么这样写感到有些困惑。为什么要检查returnUrl是否为null,而不总是为null?为什么不删除string returnUrl = null作为方法参数并分配ReturnUrl = Url.Content("~/");?我在这里想念什么吗?

1 个答案:

答案 0 :(得分:2)

returnUrl参数已设置为使用optional argument

如果没有为该参数发送参数,则使用默认值。

对于身份的默认设置,returnUrl的值来自请求URL的查询字符串。例如,以下URL为returnUrl参数提供了一个值:

/Identity/Account/Login?returnUrl=/Some/Protected/Route

在这种情况下,returnUrl不是null。但是,请考虑以下URL:

/Identity/Account/Login

在这种情况下,returnUrl将是null。登录过程完成后,没有URL可以重定向到,因此您调出的行会将其设置为Url.Content("~/")。这只是意味着它将最终将用户重定向到Web应用程序的根目录,通常是主页。