mvc 3,jquery ajax和表单身份验证

Nim*_*ima 6 ajax jquery forms-authentication authorize asp.net-mvc-3

在我的MVC3项目中,我有一个带有[Authorize]属性的控制器.我有一个没有ajax的表单提交,如果他/她没有登录,它会将用户(如预期的那样)重定向到登录屏幕.

但是,现在我有一个用jquery ajax提交的表单,我怎么能做同样的事情呢?如果他/她未获得授权,请将用户重定向到登录屏幕?成功登录后,应将用户重定向到初始操作.

调节器

[Authorize]
[ValidateInput(false)] 
public JsonResult SubmitChatMessage(string message)
        {
            if (!string.IsNullOrEmpty(message))
            {
                // Do stuff
            }

            // Return all chat messages
            return GetChatMessages();
        }
Run Code Online (Sandbox Code Playgroud)

客户端JQUERY

$(document).ready(function () {
    $("form[action$='SubmitChatMessage']").submit(function (event) {
        $.ajax({
            url: $(this).attr("action"),
            type: "post",
            dataType: "json",
            data: $(this).serialize(),
            success: function (response) {
                // do stuff
            }
        });
        return false; 
    });
});
Run Code Online (Sandbox Code Playgroud)

我可以从firebug控制台窗口看到,服务器返回:

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage
Run Code Online (Sandbox Code Playgroud)

期待您的帮助!

更新可能的解决方案

RPM*_*984 6

是的,这是我一直讨厌 ASP.NET中的表单身份验证的事情之一- 根本不满足AJAX身份验证.将IIS处理401添加到混合中,这可能会非常痛苦.

有几种方法可以做到这一点,它们都不是特别"干净".

这些包括:

  1. 在控制器中设置ViewBag标志,该标志对应于Request.IsAuthenticated,如果未经过身份验证,则将提交按钮单击事件重新写入登录页面.

  2. 让你的AJAX动作返回JsonResult,这是"代码"的属性.如果代码0可以成功,1可以是未经身份验证,2可以是其他一些数据问题等.然后在complete $.ajax回调中检查该代码并重定向到登录页面.

  3. 检查$.ajax jqXHR响应对象的状态代码403,并重定向到登录页面.

  4. 为您的提交按钮编写一个自定义HTML帮助器,它会呈现常规提交按钮或转到登录页面的锚标记,具体取决于身份验证状态.

  5. 编写自定义authorize属性,检查是否Request.IsAjaxRequest()并返回自定义JSON对象,而不是重定向到登录页面的默认行为(对于AJAX请求不会发生).