【问题标题】:MVC OnAuthorization redirect to controller/action with modelMVC OnAuthorization 重定向到带有模型的控制器/动作
【发布时间】:2015-12-22 10:07:32
【问题描述】:

更新 不是如上所述的重复,因为该问题路由到显式视图,而不是控制器/动作

我正在使用自定义授权(在控制器级别)来确保用户只能访问应用程序的特定功能(保存在外部访问控制系统中)。

下面是AuthorizeAttribute

public class MyCustomAuth : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        string ctrl = (string)filterContext.RouteData.Values["controller"];

        bool isAuth = GetAuthorizedFunctions(HttpContext.Current.User).Any(f => f.Controller.Equals(ctrl, StringComparison.InvariantCultureIgnoreCase));
        if (!isAuth)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Contact", action = "Index", AuthMsg = "Sorry, unauthorized" }));
        }
    }
}

基本上,如果用户请求他们无权访问的功能,那么我会重定向到“联系”页面以显示合适的消息。

但是,在上面,AuthMessage 被编码为 URL 字符串..

http://localhost/HotelRequests/Contact?AuthMsg=Sorry%2C%20unauthorized

如何在不显示在 URL 中的情况下传递此消息,最好作为联系人页面所需的 ViewModel。

【问题讨论】:

  • 您可以在查询字符串中发送代码,在控制器的操作中,您可以根据代码显示消息或在查询字符串中加密消息,使其可见但不可读,并在操作中解密以显示消息在视图中。
  • 不是真正的“重复”,因为它需要重定向到显式视图,而不是控制器/动作,但我猜它是另一种方法。
  • 我猜 TempData 在重定向时可用
  • TempData 似乎不是(或者我找不到)...但是 Session 是(通过filterContext.HttpContext.Session ...另一个选项...

标签: c# asp.net-mvc


【解决方案1】:

TempData 比 ViewBag 或 ViewData 寿命更长

  filterContext.Controller.TempData["AuthMsg "] = "Sorry, unauthorized";
  filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Contact", action = "Index" }));

在联系人的索引方法中将其读取为..

ViewBag.Message = TempData["AuthMsg "].ToString();

【讨论】:

  • TempData 未出现在 OnAuthorization() 方法中
  • 更新到filterContext.Controller.TempData[]
  • 我现在没有我的机器,稍后会测试它,谢谢。我想这现在应该可以工作了
猜你喜欢
  • 1970-01-01
  • 2016-10-06
  • 2015-04-15
  • 2014-12-25
  • 2010-12-02
  • 2011-04-30
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
相关资源
最近更新 更多