【问题标题】:durandal mvc app authentication securitydurandal mvc 应用程序身份验证安全性
【发布时间】:2013-03-05 23:00:12
【问题描述】:

我能够成功使用(索引视图中的代码)

  @if (@User.Identity.IsAuthenticated)
    {
    <div id="applicationHost">
        @Html.Partial("_splash")
    </div>

   @Scripts.Render("~/scripts/vendor");
        if(HttpContext.Current.IsDebuggingEnabled) {
            @Html.AntiForgeryToken()
            <script>
               window.userId = "@User.Identity.Name";
                console.log(window.userId);
            </script>
            <script type="text/javascript" src="~/App/durandal/amd/require.js" data-main="@Url.Content("~/App/main")"></script>

        } else {
            <!-- Remember to run the Durandal optimizer.exe to create the main-built.js  -->
            <script type="text/javascript" src="~/App/main-built.js"></script>
        }
    }
    else
    {
        <script src="~/Scripts/jquery-1.9.1.min.js"></script>

            <div id="login">
              @Html.Partial("Login")
            </div>

    }

在登录后(使用标准 mvc 帐户控制器和标准 mvc4 应用程序的登录表单。

然后我在页脚添加了一个按钮来调用注销控制器方法(此函数已添加到 shell.js 中,并且我已验证按下按钮时会调用它)

 function logoff() {
            var token = $("input[name='__RequestVerificationToken']").val();

            $.ajax({
                url: "/Account/LogOff",
                cache: false,
                type: "POST",
                async: false,
                data: { "__RequestVerificationToken": token },
                success: function (data) {
                    log("from success in logoff", data, false); //this shows up in the log


                    return true;
                },
                error: function (data) {
                    return false;
                }

            });
        }

我已经通过控制器方法进行了调试,它成功调用了

  [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult LogOff()
        {
            try{
            WebSecurity.Logout();  //this call does not generate an error
            }   
            catch(Exception excp)
            {
                string msg = excp.Message;
            }
            return RedirectToAction("index", "HotTowel");
        }

索引页面被调用并且用户不再被认证,但是 上面调用 PartialView("Login") 不会修改浏览器的内容。

我不明白为什么浏览器中没有加载登录部分视图。 我在控制台中没有任何错误,也没有其他迹象表明有问题。

我搜索了一下,没有找到任何扩展 Hot Towel 模板以支持身份验证的示例。 (除了关于如何设置身份验证令牌的几件事) 我迈出了第一步,只是让索引视图能够在 durandal 应用程序加载之前强制用户登录。这很好用。

什么是让它工作的正确方法? 我有一个使用 Durnadal 入门套件的示例,它显示了这种行为。 我可以提供给任何需要的人。

shell.js 中的 javascript 返回似乎是重定向指示的索引页面的 html。 (试图让警报显示这一切是有问题的)

正在为 Skydrive 等获取样本

【问题讨论】:

  • “成功”回调中的“数据”参数显示什么?
  • 从下面的javascript返回的数据元素
  • 压缩您的项目,然后在此处发布。它可能无法正常工作有几个可能的原因。而不是在注销后路由到索引..重定向到登录页面。还要检查 Html.Render("Login") 是否有效。
  • 我能够弄清楚这一点。正如 Evan 可能怀疑的那样,我通过使用 ajax 调用 loutgout 来破坏重定向。改为将其更改为表单帖子,一切正常。唯一真正的技巧是如何让验证令牌以您的形式呈现。当我有机会时,我会发布整个项目

标签: security durandal hottowel


【解决方案1】:

我也遇到过这个问题:

        <div id="login">
          @Html.Partial("Login")
        </div>

应该换成

        <div id="login">
          @Html.Partial("../Account/Login")
        </div>

这样它就可以找到您希望呈现的登录名的直接路径。这应该可以解决您的问题。尽管您在“登录”页面上至少没有出现 404 错误,但这很奇怪。我怀疑某些错误处理已完成但未显示。

【讨论】:

    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多