在身份 2.0 中重定向未经授权的用户
Redirecting an unauthorized user in identity 2.0
对于我的 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" }));
}
}
对于重定向未经授权的用户,您不需要自定义 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")
对于我的 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" }));
}
}
对于重定向未经授权的用户,您不需要自定义 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")