ASP Core 2.1-将适当的UserRole路由到区域

时间:2019-04-02 11:19:31

标签: c# asp.net asp.net-core asp.net-routing asp.net-roles

在进行一个需要不同用户角色/类型至关重要的项目时,我提供了一个自定义中间件服务,用于选择适当的角色(如果有多个可用角色),并且还通过Azure Ad对每个角色的策略进行身份验证。 这很好用,但是尝试将角色分组到区域中时出现问题。

我尝试为相应的用户组设置不同的区域,因此,如果您以“运营商”身份登录,我将被重定向到“运营商/家庭/索引”。

在这里和其他地方进行了很多研究,但是大多数研究似乎已经过时或不完整,所以我决定发表一篇文章。

public class RoleConstraint : IRouteConstraint
{
    private readonly RequiredRole _requiredRole;

    public RoleConstraint(RequiredRole requiredRole)
    {
        _requiredRole = requiredRole;
    }

    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        var selectedRoleString = httpContext.Request.Cookies[SysVariables.SelectedRoleCookieKey];
        var selectedRole = selectedRoleString.ToRequiredRole();
        var area = (string) values.GetValueOrDefault("Area");

        if (area == "Admin" && selectedRole == RequiredRole.Admin)
        {
            return true;
        }

        if (area == "Internal" && selectedRole == RequiredRole.Internal)
        {
            return true;
        }

        if (area == "Customer" && selectedRole == RequiredRole.Customer)
        {
            return true;
        }

        return selectedRole == _requiredRole;
    }
}

在Startup.cs / Configure()中应用的路由:

app.UseMvc(routes => {
            routes.MapRoute(
                name: "Internal_default",
                template: "Internal/{controller}/{action}/{id?}",
                defaults: new { action = "Index" },
                constraints: new { author_role = new RoleConstraint(RequiredRole.Internal) }
            );

            routes.MapRoute(
                name: "customer_route",
                template: "{area}/{controller}/{action}/{id?}",
                defaults: new { area = "Customer", controller = "Home", action = "Index" },
                constraints: new { author_role = new RoleConstraint(RequiredRole.Customer) }
            );

            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=ChooseLanguage}/{id?}"
            );
        });

Area folder structure Attributes for controller

所有基本的Customer控制器都应该继承自CustomerBaseController。

如果有人可以在这里帮助我,将不胜感激! 预先感谢。

0 个答案:

没有答案