首页 > 解决方案 > 导航栏中登录链接上的重定向 URL

问题描述

我一直在构建一个剃须刀页面 ASP.Net Core 3.1 网站,并且有些页面的内容无需身份验证即可看到,并且当用户通过身份验证时,它会显示附加信息。

当用户访问需要完全授权的页面时,它会立即将他们带到 AzureAD 登录页面,将他们登录,然后将他们重定向到他们刚刚访问的页面。

在需要授权才能查看其他详细信息的页面上单击“登录”链接时,它会将它们带到 AzureAD 登录页面,登录,然后将它们重定向到索引页面。我希望此链接具有相同的行为并将它们重定向到他们刚刚所在的页面。

_LoginPartial.cshtml

@if (User.Identity.IsAuthenticated)
{
<ul class="nav navbar-nav ml-auto">
    <li class="navbar-text nav-item">Hello @User.FindFirst(System.Security.Claims.ClaimTypes.GivenName).Value!</li>
    <li class="nav-item"><a class="nav-link" asp-area="AzureAD" asp-controller="Account" asp-action="SignOut">Sign out</a></li>
</ul>
}
else
{
    <ul class="nav navbar-nav ml-auto">
        <li class="nav-item"><a class="nav-link" asp-area="AzureAD" asp-controller="Account" asp-action="SignIn" >Sign in</a></li>
    </ul>
}

例子

例如,如果用户通过 QR 码获取链接,它不会自动让用户登录。当他们单击登录链接时,它会将用户重定向到索引页面。然后,用户需要返回二维码应用程序并重新扫描二维码或重新单击链接以返回同一页面。

解决方案

感谢南宇提供以下解决方案。我已经修改它以接受查询字符串。

_LoginPartial.cshtml

 <ul class="nav navbar-nav ml-auto">
        <li class="nav-item">
            <a class="nav-link" asp-area="" asp-route-path="@Context.Request.Path" asp-route-query="@Context.Request.QueryString" asp-page="/Account" asp-page-handler="SignIn">Sign in</a>
        </li>
    </ul>

帐户.cshtml

  public IActionResult OnGetSignIn(string path, string query)
        {

            var redirectUrl = Url.Content("~/");

            if(Url.IsLocalUrl(path+query))
                return Challenge(
                    new AuthenticationProperties { RedirectUri = path + query },
                    AzureADDefaults.AuthenticationScheme);
            return Redirect("~/");


        }

标签: c#asp.net-core.net-coreazure-active-directoryrazor-pages

解决方案


您可以自定义逻辑以在 Razor 页面应用程序中实现:

  1. 在 Pages 文件夹中添加 Account razor 页面,并添加一种方法来使用当前页面的路径对身份验证质询进行分类:

    public IActionResult OnGetSignIn(string path)
    {
    
        var redirectUrl = Url.Content("~/");
        return Challenge(
            new AuthenticationProperties { RedirectUri = path },
            AzureADDefaults.AuthenticationScheme);
    }
    

在 _LoginPartial 中,修改路由并将路径设置为:

    <li class="nav-item">
        <a class="nav-link text-dark"  asp-area="" asp-route-path="@Context.Request.Path" asp-page="/Account" asp-page-handler="SignIn" >Sign in</a>
    </li>

用户通过身份验证后,用户将被重定向到 AuthenticationProperties 中的 RedirectUri 配置。


推荐阅读