在ASP.NET Core Net 6中验证每个请求的路由数据

y1aodyip  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(244)

我目前正在将一个ASP.NetMVC6应用程序迁移到CoreNet 6。除了默认的Controller/Action/Id路由之外,我正在创建一个额外的路由,它在URL中包含一个customerkey:

app.MapControllerRoute(
     name: "ManagingCustomer",
     pattern: "{customerkey:int}/{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
     name: "Default",
     pattern: "{controller=Home}/{action=Index}/{id?}");

在应用程序中,用户可以管理自己的账户或其他他们有权访问的账户。当他们管理自己以外的账户时,我会使用前置的customerkey路由数据进行导航。
如果一个URL包含customerkey路由数据项,我可以在管道中的什么位置注入代码来验证当前已验证的用户是否确实有权访问所请求的帐户?我希望在每个请求上都运行此代码,而不必为了支持它而向每个控制器和操作添加代码。在旧的MVC 6应用中,我会在global.asax.cs中完成这个。我只是不知道它在核心世界中的位置。我猜它福尔斯中间件。任何帮助都将不胜感激。谢谢。

u1ehiz5o

u1ehiz5o1#

如果您已经注册了授权策略,我想您可以尝试以下操作:

app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "ManageCustomer",
                    pattern: "somesection/{controller=Home}/{action=Index}/{id?}").RequireAuthorization("Policyname");
                .......
            });

也许您可以尝试使用Fallbackpolicy作为此文档:
如果您只想获取customerkey并在中间件中验证它,您可以尝试如下:

app.Use(
            async (context, next) =>
            {
                
                var routevalue = context.Request.RouteValues;
                var customerkey = routevalue.ContainsKey("customerkey") ? routevalue["customerkey"].ToString() : "";
                //add your logical here
                if (customerkey != "")
                {
                    await next.Invoke();
                }
                context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                await context.Response.WriteAsync("ErrorInfo");
            });

相关问题