在进行一个需要不同用户角色/类型至关重要的项目时,我提供了一个自定义中间件服务,用于选择适当的角色(如果有多个可用角色),并且还通过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?}"
);
});
所有基本的Customer控制器都应该继承自CustomerBaseController。
如果有人可以在这里帮助我,将不胜感激! 预先感谢。