ClaimsAuthorizationManager.CheckAccess:处理false而不进入登录页面

Mat*_*rie 3 claims-based-identity asp.net-mvc-4

我正在开发一个使用ACS进行身份验证的ASP.NET MVC应用程序.必须对用户进行身份验证才能访问该站点的任何部分.

我已经创建并配置了ClaimsAuthorizationManager,将我的自定义逻辑放在CheckAccess方法中,并且我在使用ThinkTecture的IdentityModel属性的控制器方法上以声明方式使用它.

例如:[ClaimsAuthorize("Edit","Clients")]

如果经过身份验证的用户尝试访问他们没有足够权限访问CheckAccess方法的资源,则会按预期返回false.但是,然后用户立即再次重定向到登录页面.这显然是不正确的,因为用户已经过身份验证(只是未经授权).我想要发生的是将用户重定向到一个视图,通知用户他们无法访问所需的资源.我一直无法在管道或配置中找到正确的位置来实现这一目标.

我能够做到的唯一方法是在CheckAccess中抛出自定义异常而不是返回false,然后在Application_Error中处理异常.这显然是不正确的.达到我想要的结果的正确模式是什么?

谢谢

Mat*_*rie 5

对于任何有兴趣的人,我实施了如下建议的解决方案:

    public class CustomClaimAuthorizeAttribute : ClaimsAuthorizeAttribute
{
    public CustomClaimAuthorizeAttribute()
    {
    }

    public CustomClaimAuthorizeAttribute(string action, params string[] resources)
        : base(action, resources)
    {
    }

    protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            // User is authenticated but doesn't have sufficent permissions. Redirect to InsufficientPermissions page
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary
                {
                    {"Controller", "Security"},
                    {"Action", "InsufficientPermissions"}
                });
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)