如何让[授权]按照我的需求工作?

3

我有这个链接

@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中加载,而不是重定向到登录页面。

我还尝试了这个变体。

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

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

    }

但是它不会重定向并且仍然会加载partialView。

有谁知道我如何让它按照我想要的方式工作? 我需要Log On页面正常加载,而不是在comment-entry-box中加载。


目前,我找到了一个解决办法。我在视图中检查用户是否已登录,如果是,则显示评论链接;如果没有,则显示一个不同的链接,提示要登录才能评论。虽然不完全符合我的期望,但这个方法可以暂时解决问题,直到我找到更好的解决方案。 - Roge
此外,请确保您的CreateDebateComment操作没有被服务器缓存。可能您在登录后尝试过这个操作,然后退出并再次尝试,但是您看到的是您登录时操作的缓存结果。您可以使用OutputCacheAttribute来更改操作的缓存设置。 - moribvndvs
2个回答

1

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

True后面跟着您要显示的数据

{ "Success": "false" }

或者

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

1

您可以查看以下博客文章,Phil Haack在其中解释了如何抑制表单身份验证模块从重定向到LogOn页面,如果请求是AJAX请求并返回401 HTTP状态代码,则客户端可以拦截并相应地重定向。

因此,要么添加他展示的HttpModule,要么将他的NuGet包安装到您的项目中,然后您只需要注册一个全局ajax事件,每当页面上的某些AJAX请求从服务器返回401时就会触发:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接