【问题标题】:Redirecting an unauthorized user in identity 2.0在身份 2.0 中重定向未经授权的用户
【发布时间】:2015-11-27 11:39:01
【问题描述】:

对于我的 mvc5 项目,我已经实现了默认标识,但根据要求对其进行了更改。现在我想将未经授权的用户重定向到我创建的视图。我创建了一个自定义授权过滤器。当未经授权的用户进入时,它会出现在我的错误视图中。我可以通过 URL 识别它。但问题是它没有在视图中显示内容。相反,它显示 HTTP 404 错误。我把我的代码放在下面。我知道这已经在这里被问过好几次了。但我仍然无法解决它。所有帮助表示赞赏。提前致谢!

public class CustomAuthorize : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        else
        {
            filterContext.Result = new RedirectToRouteResult(new
            RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
        }
    }
}

错误控制器

public class ErrorController : Controller
{
    // GET: Error
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult AccessDenied()
    {
        return View();
    }
}

拒绝访问视图

<h2>AccessDenied</h2>

Access Denied

在特定的控制器上

[CustomAuthorize(Roles = "Admin")]
public class ProductTypeController : Controller
{
}

我得到错误

HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下 URL 并确保其拼写正确。

更新问题

现在我想将未经授权的用户重定向到 ErrorView 并将未经身份验证的用户重定向到登录页面。我已将修改后的 CustomAuthorise 放在下面。但它不起作用。请指导我..

public class CustomAuthorize : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (!httpContext.Request.IsAuthenticated)
            return false;
        else 
            return true;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(new
        RouteValueDictionary(new { controller = "Error", action = "AccessDenied" }));
    }
} 

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 asp.net-identity asp.net-identity-2 authorize-attribute


    【解决方案1】:

    对于重定向未经授权的用户,您无需自定义 AuthorizeAttribute。只需在Startup.ConfigureAuth(IAppBuilder app) 方法或您自定义的 OWIN 启动方法中添加以下行:

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Error/AccessDenied"),
        });
    }
    

    但是,如果您想区分未经身份验证的用户和未经授权的用户。像这样编写您的自定义过滤器:

    public class MyAuthAttribute: AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if(filterContext.HttpContext.User.Identity.IsAuthenticated)
            {
                filterContext.Result = new RedirectResult("/Error/AccessDenied");
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }        
        }
    }
    

    然后你可以在OWIN启动方法中添加登录url:

    LoginPath = new PathString("/Account/Login")
    

    【讨论】:

    • 再次感谢您... :) 是的,您的解决方案解决了它。但还有另一个问题。未经身份验证的用户也会使用您的解决方案重定向到 AccessDenied 视图。但如果我可以将它们重定向到登录页面会更好。解决方案是什么?
    • 在这种情况下,您可以使用自定义过滤器来检查您在 AuthorizeAttribute.AuthorizeCore() 中的所需权限,如果用户登录但不满足该页面权限,则返回 false 并在 HandleUnauthorizedRequest 中将其重定向如下:filterContext.Result = new RedirectResult("/Error/AccessDenied")
    • 我按照你说的做了。但它不起作用。请指导我。我已经更新了我的问题(更新问题部分)。
    • 我更新了我的帖子。但它看起来和你的几乎一样。只需稍作改动。
    • 感谢您为烦人的问题提供了出色而简单的解决方案。当用户已经通过身份验证但缺乏角色成员资格时,他们不断被抛回到登录屏幕而没有任何解释,这对用户来说非常困惑。更好的是,我将 filterContext.Result = new ViewResult { ViewName = "Unauthorized" } 设置为“未授权”作为共享文件夹中的视图。这会保留用户尝试访问的 URL(因此他们知道他们被阻止的内容)。使用共享视图可以从任何地方访问它。
    猜你喜欢
    • 2015-09-28
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多