我已经构建了一个ASP.NET CORE MVC应用程序,并使用cookie身份验证。下面是我在Startup.cs文件中的代码。
services.AddAuthentication(options =>
{
// these must be set other ASP.NET Core will throw exception that no
// default authentication scheme or default challenge scheme is set.
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(options =>
{
options.LoginPath = "/Account/Login/";
});
cookie过期后,应用程序将重定向到/Account/Login
路径,返回Url包含用户所在的当前Url。在当前Url具有0
或1
查询参数之前,此操作一直有效。如果当前url有2个查询参数,那么只有第一个查询参数被传递给返回url。Login方法如下。
public IActionResult Login(string returnUrl)
{
return View(new LogInViewModel { ReturnUrl = returnUrl });
}
例如。如果当前URL是/Inspection?inspectionID=1&processTypeID=2
,那么返回的URL只得到/Inspection?inspectionID=1
。processtypeID
参数不会出现。
但是,当浏览器在cookie过期时导航到/Account/Login
URL时,它会显示正确的URL/Account/Login?ReturnUrl=/Inspection?inspectionID=1&processTypeID=2
有人能告诉我为什么会发生这种情况以及如何解决吗?
谢谢,泽汉
对重定向uri的值进行编码为我解决了这个问题。
在我的情况下,我有一个blazor页面,上面有:
<a href="auth/Signin?redirectUri=@RedirectUri">Sign In</a>
其中RedirectUri
返回完整的当前页面路径,包括多个查询参数。
我将链接更改为:
<a href="auth/Signin?redirectUri=@UrlEncode(RedirectUri)">Sign In</a>
,关键是UrlEncode(RedirectUri)
,它为我解决了问题。
可以在名称空间CCD_ 14上找到CCD_。