1

我正在开发一个应用程序,并使用 Fluent Security 对其进行保护。我在 Web 应用程序中有 2 个不同的区域,即管理区域和成员区域。我按照 fluent 安全网站中的指南实施了我的策略违规处理程序。一切正常,除了抛出异常时我需要重定向到错误页面。这些根据您所在的地区而有所不同。例如,管理区域的 ForbiddenAccess 错误页面与成员区域的错误页面不同。

我的 IPolicyViolationHandler 实现如下。

public class DenyAnonymousAccessPolicyViolationHandler : IPolicyViolationHandler
{
    public ActionResult Handle(PolicyViolationException exception)
    {
        return
            new RedirectToRouteResult(
                new RouteValueDictionary(new { action = "AnonymousError", controller = "Error", area = "Admin" }));
    }
}

我需要找到错误发生的位置,以便当我重定向我的区域是“管理员”或“成员”时,我无法弄清楚如何从异常中获取该信息。如果我能得到这些信息,重定向到适当的页面是微不足道的。任何帮助、建议,或者如果不可能,请提供解决方法。

谢谢,

4

1 回答 1

2

目前无法从 FluentSecurity 中提取该信息,但无论如何应该很容易做到。

下面是两个扩展方法,可以帮助您获取当前区域名称。

public static string GetAreaName(this RouteData routeData)
{
    object value;
    if (routeData.DataTokens.TryGetValue("area", out value))
    {
        return (value as string);
    }
    return GetAreaName(routeData.Route);
}

public static string GetAreaName(this RouteBase route)
{
    var areRoute = route as IRouteWithArea;
    if (areRoute != null)
    {
        return areRoute.Area;
    }

    var standardRoute = route as Route;
    if ((standardRoute != null) && (standardRoute.DataTokens != null))
    {
        return (standardRoute.DataTokens["area"] as string) ?? string.Empty;
    }

    return string.Empty;
}

这里是你将如何使用它:

public class DenyAnonymousAccessPolicyViolationHandler : IPolicyViolationHandler
{
    public ActionResult Handle(PolicyViolationException exception)
    {
        var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(HttpContext.Current));
        var areaName = routeData.GetAreaName();
        return
            new RedirectToRouteResult(
                new RouteValueDictionary(new { action = "AnonymousError", controller = "Error", area = areaName }));
    }
}

随意为其添加功能请求

于 2012-07-04T07:41:04.257 回答