Asp.net mvc 4 ClaimsAuthorizationManager.CheckAccess:在不进入登录页面的情况下处理false

Asp.net mvc 4 ClaimsAuthorizationManager.CheckAccess:在不进入登录页面的情况下处理false,asp.net-mvc-4,claims-based-identity,Asp.net Mvc 4,Claims Based Identity,我正在开发一个ASP.NET MVC应用程序,它使用ACS进行身份验证。用户必须经过身份验证才能访问网站的任何部分 我已经创建并配置了ClaimsAuthorizationManager,将自定义逻辑放在CheckAccess方法中,并使用ThinkTecture的IdentityModel属性在控制器方法上声明性地使用它 例如:[索赔授权(“编辑”、“客户”)] 如果经过身份验证的用户试图访问他们没有足够权限访问的资源,CheckAccess方法将按预期返回false。但是,用户随后会立即再次

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

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

例如:[索赔授权(“编辑”、“客户”)]

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

我能够做到这一点的唯一方法是在CheckAccess中抛出一个自定义异常,而不是返回false,然后在Application\u Error中处理该异常。这显然是错误的。达到预期效果的正确模式是什么

谢谢


Mat

在ASP.NET管道中处理401,或者从ClaimsAuthorizeAttribute派生并重写SendUnauthorizedResponse(或类似)方法。

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

    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);
        }
    }
}

杰出的谢谢我会试试的,好好享受一下。谢谢