从AuthorizeCore重定向到另一个具有自定义错误消息的控制器

时间:2017-08-28 13:20:54

标签: asp.net httpcontext

所以我试图向用户显示一条消息,当他从他无权查看的页面被重定向时。示例:用户访问www.mypage.com/users并重定向到www.mypage.com/home。

我使用MVC模式,它是asp.net Web应用程序。 我重写AuthorizeAttribute并在AuthorizeCore方法中尝试这个:

var unauthorized_access_message = TempData["myErrorMessage"] as List <string> ?? new List<string>() ;

然后我尝试从视图中访问它

function t_replace(data){
    var re = /"(\\[\s\S]|[^"])*"|'(\\[\s\S]|[^'])*'|(\/\/.*|\/\*[\s\S]*?\*\/)/g;
    return data.replace(re, function(all, strDouble, strSingle, comment) {
        if (comment) {
            return all.replace(/"/g, '&quot;').replace(/'/g, '&apos;');
        }
        return all;
    });
}

但它不起作用。我也试过this,但事实并非如此,因为我试图访问一个控制器然后重定向到另一个控制器。 是否有任何解决方案可以将变量传递给视图或在视图中检查某些状态(如重定向原因)?

2 个答案:

答案 0 :(得分:0)

您是否可以覆盖AuthorizeCore而不是OnAuthorization,而可以直接从TempData访问Controller

public override void OnAuthorization(AuthorizationContext filterContext)
{
    if (false)
    {
        filterContext.Controller.TempData["myErrorMessage"] =
            "You don't have an access to selected menu item.";
    }
    base.OnAuthorization(filterContext);
}

用法

string unauthorized_access_message = (TempData["myErrorMessage"] ?? "").ToString();

答案 1 :(得分:0)

我使用Cookie解决了这个问题。

在CustomAuthorizeAttribute中设置cookie:AuthorizeAttribute类:

protected override bool AuthorizeCore(HttpContextBase httpContext)
            {

                if (false)
                {
                    HttpCookie mycookie= new HttpCookie("unauthorize_error", "You do not have access to requested link.");
                    httpContext.Response.SetCookie(mycookie);
                    httpContext.Response.Redirect("Home");
                    return false;
                }
                else
                {
                    return base.AuthorizeCore(httpContext);
                }
            }

然后在控制器中:

string cookieValue = string.Empty;
            if (Request.Cookies["myCookieName"] != null
                && !string.IsNullOrEmpty(Request.Cookies["myCookieName"].Value))
            {
                cookieValue = Request.Cookies["myCookieName"].Value;
                var myCookie = new System.Web.HttpCookie("myCookieName");
                myCookie.Expires = System.DateTime.Now.AddDays(-1d);
                Response.Cookies.Add("myCookieName");
            }
var messages = TempData["mytemperror"] as List<string> ?? new List<string>();
            messages.Add(message);
            TempData["myTempError"] = messages;

最后在视野中:

var errorMessage = TempData["myTempError"] as List<string> ?? new List<string>();