在 ASP.NET Core 中自动设置路由参数

问题描述 投票:0回答:1

考虑到这样的场景:只要用户获得授权,就应该在身份验证后存储特定标识符,并将其保留在路径中,而无需每次从后端重定向时指定。

更具体地说,当用户登录时,他们的用户名(本例中的标识符)将存储为声明。现在,他们的所有操作都应该在

https://example.com/{username}/....
下。
这里出现的问题是,据我所知,每次通过
IUrlHelper
生成 URL 或通过
IActionResult
s 重定向时,我都需要传递此用户名。

ASP.NET Core
是否为该场景提供任何标准API?
如果没有,假设我必须即兴发挥,这个问题有哪些可能的解决方法?

注意: 上面的示例旨在描述问题;这种方法背后的原因及其带来的好处是另一回事。

提前谢谢大家!

asp.net-core .net-core asp.net-core-mvc
1个回答
0
投票

您可以尝试重写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();

结果:

© www.soinside.com 2019 - 2024. All rights reserved.