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

C# MVC OnAuthorization重定向到具有模型的控制器/操作,c#,asp.net-mvc,C#,Asp.net Mvc,更新 根据上述,不是重复的问题,因为问题路由到显式视图,而不是控制器/操作 我使用自定义授权(控制器级别)确保用户只能访问应用程序的特定功能(保存在外部访问控制系统中) 下面是authorized属性类 public class MyCustomAuth : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { string c

更新 根据上述,不是重复的问题,因为问题路由到显式视图,而不是控制器/操作

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

下面是
authorized属性

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比ViewBag或ViewData的寿命更长

  filterContext.Controller.TempData["AuthMsg "] = "Sorry, unauthorized";
  filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Contact", action = "Index" }));
在Contact的索引方法中阅读为

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

TempData比ViewBag或ViewData的寿命更长

  filterContext.Controller.TempData["AuthMsg "] = "Sorry, unauthorized";
  filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "Contact", action = "Index" }));
在Contact的索引方法中阅读为

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

您可以在查询字符串中发送代码,在控制器的操作中,您可以基于代码显示消息,或者在查询字符串中加密消息,使其可见但不可读,并在操作中解密以在视图中显示消息。可能的重复不是真正的“重复”,因为它需要重定向到显式视图,而不是控制器/动作,但我想这是另一种方法。我想TempData在redirectionTempData上可用TempData似乎不存在(或者我找不到它)。。。但会议是(通过
filterContext.HttpContext.Session
…另一个选项…您可以在查询字符串中发送代码,在控制器的操作中,您可以基于代码显示消息,或者在查询字符串中加密消息,使其可见但不可读,并在操作中解密以在视图中显示消息。可能的重复不是真正的“重复”因为它需要重定向到显式视图,而不是控制器/操作,但我想这是另一种方法。我想在重定向上可以使用TempData TempData似乎不是(或者我找不到它)…但会话是(通过
filterContext.HttpContext.Session
…另一个选项…在OnAuthorization()中没有出现TempData)方法更新为
filterContext.Controller.TempData[]
我现在没有我的机器,请稍后测试,谢谢。我想现在应该可以了TempData没有出现在OnAuthorization()方法中更新为
filterContext.Controller.TempData[]
我现在没有我的机器,稍后会测试,谢谢。我想现在应该可以了