c# - 导航栏中登录链接上的重定向 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("~/");
}
解决方案
您可以自定义逻辑以在 Razor 页面应用程序中实现:
在 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 配置。
推荐阅读
- java - 如何将静态对象发送到 Thymaf 视图?
- python - 带有管道的 termios 中的“设备的 ioctl 不合适”
- vba - Workbook.Unprotect 在 ACCESS VBA 中不起作用
- dynamic-linking - 可执行文件未链接到我想要的动态库
- javascript - Typescript 在某些函数中将 var 读取为空数组,但在其他函数中则不然
- ios - 带有 Swift 的 HealthKit 中用于 HKBloodGlucose 的 HKUnit
- ios - SwiftUI - 在禁用的 SecureField 中检测水龙头?
- java - JavaFX 控制器未检测到对象(Intelij IDE)
- html - 使用 jQuery 删除字符串的多个部分
- angular - 如何将表单控件值转换为角度对象?