如何让[授权]按我想要的方式工作?

时间:2012-04-08 19:54:46

标签: c# asp.net asp.net-mvc

我有这个链接

@Ajax.ActionLink("comment", "CreateDebateComment", new { id = Model.DebateID}, new AjaxOptions
{
    UpdateTargetId = "comment-entry-box",
    InsertionMode = InsertionMode.Replace,
    HttpMethod = "GET"
});

触发此控制器

  [Authorize]
    public PartialViewResult CreateDebateComment(int id)
    {


            DebateIDForComment = id;
            return PartialView("_CreateDebateCommentPartial");

    }

如果用户未登录,则会将其重定向到LogOn页面,但会在comment-entry-box div中加载,而不是重定向到Login Page

我也尝试了这种变化

 public PartialViewResult CreateDebateComment(int id)
    {
        if (!User.Identity.IsAuthenticated)
        {
            RedirectToAction("LogOn", "Account");
        }

            DebateIDForComment = id;
            return PartialView("_CreateDebateCommentPartial");

    }

但它没有重定向,仍会加载partialView

有谁知道如何才能让我按照自己的意愿运作?我需要登录页面正常加载,而不是在评论条目框中加载。

2 个答案:

答案 0 :(得分:1)

如果不使用[授权](我意识到这是问题)怎么办? 您在代码中检查授权(例如!User.Identity.IsAuthenticated)并将您的响应包装在json中,客户端的false重定向到登录[通过javascript]

True后面是您要显示的数据

{ "Success": "false" }

{ "Success": "true", "data": "blah blah blah" }

答案 1 :(得分:1)

您可以查看一下following blog post,其中Phil Haack解释了如果请求是AJAX请求并返回401 HTTP状态代码,您可以如何禁止表单身份验证模块重定向到LogOn页面可以被客户拦截并相应地重定向。

所以要么添加他展示的HttpModule,要么将他的NuGet包安装到你的项目中,然后你所要做的就是注册一个全局的ajax事件,每当你在页面上的一些AJAX请求命中401时,它就会被触发服务器:

<script type="text/javascript">
    $.ajaxSetup({
        statusCode: {
            401: function () {
                window.location.href = '@Url.Action("logon", "account")';
            }
        }
    });
</script>