2011-07-31 111 views
6

在我的MVC3项目中,我有一个具有[Authorize]属性的控制器。 我有一个表单提交没有AJAX,重定向用户(如预期)登录屏幕,如果他/她没有登录。mvc 3,jquery ajax&表单身份验证

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

控制器

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

      // Return all chat messages 
      return GetChatMessages(); 
     } 

客户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; 
    }); 
}); 

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

GET http://domain/Account/LogOn?ReturnUrl=%2fProductDetails%2fSubmitChatMessage 

期待您的帮助!

更新了可能的解决方案

+0

如果您只是在做重定向,那么AJAX登录有什么意义呢?为什么不使用常规表单? – RPM1984

+0

问题是,登录用户应该能够使用ajax将一些数据提交给控制器。如果他们没有登录,该怎么办?如何用jquery ajax处理这个场景? – Nima

+0

对,我的坏 - 我误解了。答案已添加。 – RPM1984

回答

6

是的,这是我一直想要的东西之一讨厌关于ASP.NET中的表单身份验证 - 根本不支持AJAX身份验证。添加IIS处理401的混合,这可能是一个相当痛苦。

有几种方法可以做到这一点,它们都不是特别“干净”的。

这些措施包括:

  1. 设置控制器,这相当于一个Request.IsAuthenticated标志ViewBag,那么如果他们没有身份验证的重新编写提交按钮点击事件到登录页面。

  2. 使您的AJAX操作返回JsonResult,它是“代码”的属性。如果0的代码可以成功,则1可以是未认证的,2可以是其他数据问题等。然后检查complete$.ajax回调中的代码并重定向到登录页面。

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

  4. 为您的提交按钮编写自定义HTML帮助程序,该按钮可呈现常规提交按钮或转到登录页面的定位标记,具体取决于身份验证状态。

  5. 编写一个自定义授权属性,它检查Request.IsAjaxRequest()是否会返回一个自定义JSON对象,而不是重定向到登录页面的默认行为(对于AJAX请求不会发生这种情况)。

+0

感谢您的不同解决方案。我将更新我的问题与其他与您的答案相关的帖子,以更详细地描述不同的解决方案。 – Nima

+0

如果用户没有登录,您可以在C#函数中重定向到操作(会话超时或登录屏幕?)吗? – nagates

0

这是一个有点痛,是诚实的。更重要的是,在我看来,如果您使用的是联合身份验证,例如Windows Identity Foundation和/或Azure AppFabric访问控制服务。

您的Ajax调用无法处理重定向。

我的解决方案/建议不是用[Authorize]标记Ajax调用的控制器操作方法,而是依赖于存在一些从控制器操作插入到会话状态的值,该操作具有[授权] (通常是调用显示视图的控制器操作方法)。您知道,除非用户已通过身份验证(并且会话尚未超时),否则该值无法进入会话状态。如果此值不存在,则将对该Ajax方法的调用失败,并返回可在客户端代码中正常处理的特定JSON结果。

在Ajax控制器方法上使用[Authorize]会导致奇怪的,经常隐藏的错误(例如更新消失)。

+0

你是对的,这是一种痛苦。这实际上是一个使用会话状态的好方案,我会考虑的。 – Nima