我的Controller类用一个AuthorizeAttribute装饰以保护操作:
[Authorize(Roles = "User Level 2")] public class BuyController : Controller { ... }
每当一个动作被调用,但用户至少不是在“用户级别2”角色,他会被自动重定向到登录页面与一个url如下:
http://localhost:1436/Account/Login?ReturnUrl=%2fBuy
如果用户已经登录,但没有正确的安全级别,这不是一个最佳的行为!显示一个通知用户关于缺少的级别而不是显示登录页面的页面将更有意义。
解决方法
你可以像这样构建自己的authorize属性:
public class ClubAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult) { filterContext.Result = new RedirectToRouteResult( new RouteValueDictionary { { "clubShortName",filterContext.RouteData.Values[ "clubShortName" ] },{ "controller","Account" },{ "action","Login" },{ "ReturnUrl",filterContext.HttpContext.Request.RawUrl } }); } } }
我用这个重定向到我在建立的俱乐部会员网站中的特定俱乐部。你可以根据你的需要来适应。 BTW,在我的情况下,我做重定向到登录页面,但我检查以查看用户是否被授权,如果是,显示一条消息,他们没有正确的权限。毫无疑问,你还可以添加一些东西到ViewData或TempData显示在页面上,但我还没有尝试过
编辑
AuthorizationContext.Cancel在RC中不再存在。 “filterContext.Result is HttpUnauthorizedResult”似乎足够:What happened to filterContext.Cancel (ASP.NET MVC)