MVC OnAuthorization重定向到具有模型的控制器/操作

本文关键字:控制器 操作 模型 OnAuthorization 重定向 MVC | 更新日期: 2023-09-27 18:27:39

更新如上所述,不是重复的,因为该问题通向明确的视图,而不是控制器/动作

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

以下是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。

MVC OnAuthorization重定向到具有模型的控制器/操作

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