微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NET MVC C#中禁止Ajax POST返回403

如何解决.NET MVC C#中禁止Ajax POST返回403

(已经尝试过其他解决方案,但是没有用)

我正在尝试使用“列表”和“对象”从“区域视图”到“区域控制器”执行JQuery POST请求,以将其保存到数据库中并返回带有结果(错误或数据)的匿名Json对象。

现在,当我在本地主机上尝试它时,它可以按预期工作,但是当我使用FTP发布项目并执行该请求时,什么也没发生,并返回403 Forbidden-Access Denied。我已经在一般路径中发出了另一个请求,而不是在本地主机上正常工作并已发布的区域中。

我的托管服务提供商说,这不是他的许可问题,所以我开始尝试一些东西,但直到现在我都无法解决

https://i.stack.imgur.com/yg9P9.png

这是我的功能请求的代码

功能

$(document).ready(function () {
    $.ajax({
        url: "@Url.Action("GetNombre","Usuarios",new { Area = "" })",type: "POST",success: function (foo) {
            $(".foo-class").html('Hola,' + foo.nombre + '!');
        }
    });
});

这是我不起作用的要求:

函数(返回403):

$("form").submit(function (e) {
            e.preventDefault();

            //Initializing List
            var lstContacto_Clientes = [];

            $("div[id*='contacto-']").each(function () {
            ......
            });

            //Datos Cliente
            var Cliente = {
            ......
            }

            $.post({
                url: "@Url.Action("Crear","Clientes")",method: "POST",data: {
                    oClienteView: Cliente,lstContactoClientes: lstContacto_Clientes
                },success: function (result) {
                .....
                },error: function (e) {
                    console.log('JSON Error');
                    console.log(e);
                }
            });

        });

这是区域路由(这就是为什么我没有在“无功能请求”中指定区域)的原因:

    context.MapRoute(
        "Admin_Rout","Admin/AdminPanel/{action}/{id}",new { controller = "AdminPanel",action = "Index",id = UrlParameter.Optional }
    );

    context.MapRoute(
        "Admin_default","Admin/{controller}/{action}/{id}",id = UrlParameter.Optional }
    );

这是我的文件夹的分发方式:

https://i.stack.imgur.com/RlU8z.png

“客户端”控制器受以下过滤器的影响:


public class AutorizacionRolesAttribute : AuthorizeAttribute
{
    private readonly string[] allowedroles;
    public AutorizacionRolesAttribute(params string[] roles)
    {
        //De AutorizacionRoles(Roles="") recibe los valores de -Roles=""- y los guarda en un array de strings
        this.allowedroles = roles;
    }
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorize = false;
        //Recibe el ID del Usuario por la sesion
        int? userId = (int?)httpContext.Session["SessionId"];
        var token = httpContext.Session["token"];

        //Chequea solamente si recibe UNICAMENTE el param "Token",ningun otro
        //asi se chequea en la accion "Crear" si está habilitado
        if (allowedroles[0] == "Token") 
        {
            //Si NO esta vacio,devuevle TRUE
            if(token != null)
            return true;
        }
        //Chequea si userId es valido
        if (userId > 0 && userId != null)
            using (var db = new PBIEntities())
            {
                //Recibe el Rol del Usuario
                var userRole = (from u in db.Usuarios
                                join r in db.Roles on u.rol equals r.ID_Rol
                                where u.id_usuario == userId
                                select new
                                {
                                    r.Rol
                                }).FirstOrDefault();

                //Chequea que el Rol del Usuario esté habilitado recorriendo allowedroles
                foreach (var role in allowedroles)
                {
                    if (role == userRole.Rol) return true;
                }
            }


        return authorize;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectToRouteResult(
           new RouteValueDictionary
           {
                { "controller","Home" },{ "action","Index" },{ "Area","" }
           });
    }
}
    public class AutorizacionSesion : ActionFilterattribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var sessionId = HttpContext.Current.Session["SessionId"];
    
            var token = HttpContext.Current.Session["token"];
    
            //Si NO hay sesion
            if(sessionId == null)
            {
                //Si hay Token
                if (token != null)
                {
                    //Si el Controller es distinto de Usuarios
                    if (filterContext.Controller is UsuariosController == false)
                    {
                        //Devolver al Login
                        filterContext.HttpContext.Response.Redirect("~/Usuarios/Login");
                    }
                } else { 
                    //Si el Controlador es distinto de Usuarios
                    if (filterContext.Controller is UsuariosController == false)
                    {
                        //Devolver al login
                        filterContext.HttpContext.Response.Redirect("~/Usuarios/Login");
                    }
                }
            } 
    
    
            base.OnActionExecuting(filterContext);
        }
    }

编辑:(我在表单上使用 @ Html.AntiForgeryToken()

        [HttpPost]
        public ActionResult Crear(Clientes oClienteView,List<Contacto_Clientes> lstContactoClientes)
        {
            ViewBag.peticion = false;
            ViewBag.error = false;
            JSONRespuesta JSONresp = new JSONRespuesta();

            try
            {
                if (ModelState.IsValid)
                {
                    using (FOOEntities db = new FOOEntities())
                    {
                        using (DbContextTransaction transaction = db.Database.BeginTransaction())
                        {
                            try
                            {
                             .....
                            }
                            catch (Exception e)
                            {
                                transaction.Rollback();
                                JSONresp.error = true;
                                JSONresp.data = e.Message;
                                return Json(JSONresp,JsonRequestBehavior.AllowGet);
                            } 
                        }
                    }
                }

                JSONresp.error = false;
                JSONresp.op = "validacion";
                JSONresp.data = ModelState.Values.SelectMany(e => e.Errors);

                return Json(JSONresp,JsonRequestBehavior.AllowGet);
            }
            catch (Exception e)
            {
                JSONresp.error = true;
                JSONresp.data = e.Message;

                return Json(JSONresp,JsonRequestBehavior.AllowGet);
            }
        }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。