考虑到这样的场景:只要用户获得授权,就应该在身份验证后存储特定标识符,并将其保留在路径中,而无需每次从后端重定向时指定。
更具体地说,当用户登录时,他们的用户名(本例中的标识符)将存储为声明。现在,他们的所有操作都应该在
https://example.com/{username}/....
下。IUrlHelper
生成 URL 或通过 IActionResult
s 重定向时,我都需要传递此用户名。
ASP.NET Core
是否为该场景提供任何标准API?注意: 上面的示例旨在描述问题;这种方法背后的原因及其带来的好处是另一回事。
提前谢谢大家!
您可以尝试重写url,按照这个文档
一个最小的例子:
public static class MethodRules
{
public static void RedirectAuthenticatedUser(RewriteContext context)
{
var isauthenticated = context.HttpContext.User.Identity?.IsAuthenticated;
var iscontained = context.HttpContext.Request.RouteValues.ContainsKey("username");
if (isauthenticated == true&&!iscontained)
{
var username = context.HttpContext.User.Identity.Name;
var request = context.HttpContext.Request;
var response = context.HttpContext.Response;
response.StatusCode = (int)HttpStatusCode.MovedPermanently;
context.Result = RuleResult.EndResponse;
response.Headers[HeaderNames.Location] =
"/"+username + request.Path + request.QueryString;
}
}
}
在program.cs中:
......
app.UseAuthorization();
var options = new RewriteOptions().Add(MethodRules.RedirectAuthenticatedUser);
app.UseRewriter(options);
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "auth",
pattern: "{username}/{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
结果: