【问题标题】:ASP.NET Identity - Using Roles with JavaScript FunctionalityASP.NET 身份 - 使用具有 JavaScript 功能的角色
【发布时间】:2015-09-17 22:23:17
【问题描述】:

我有一个使用 JQuery DataTables 的应用程序。我希望为每个用户显示这些表格,但只允许特定角色的用户使用点击功能。

所以,我可以用这个在控制器上设置授权...

[Authorize(Roles = "Admin")]

这还不够,因为仍然会调用这个控制器和方法,并为那些不是“管理员”角色的人重定向。

假设我的 javascript 中有一个这样的函数...

//Click event on the table row
$('#table1').on('click', 'tr', function (event) {
    //Post the data to the controller
    $.ajax({
        type: "POST",
        url: "/Controller/Action",
        data: {someData : someData},
        success: function () {
            //do something 
        }
    });
});

我想在 click 事件周围加上一些东西...

if (role == "Admin") { //click event in here }

现在,我知道角色在服务器端,而 javascript 在客户端。
我已经看到了一些关于使用 razor 语法将某些内容输出到隐藏列中然后使用 javascript 获取该值的建议。像这样的...

@if (User.IsInRole("Admin"))
{
    <input type="hidden" id="isAdmin" value="true">
}

但是,这并不安全,因为仍然可以访问隐藏字段。 我可以通过什么正确的方式使用这些身份角色来处理我的 javascript?

【问题讨论】:

  • 对于不应该看到它的用户,您需要完全避免在页面上出现点击事件,否则没有什么可以阻止他们操纵 if 语句。

标签: javascript c# jquery asp.net-mvc asp.net-identity


【解决方案1】:

一种相对简单的方法是将您的管理员 JavaScript 移动到一个单独的文件中,并且仅当用户处于您的管理员角色时才包含它。例如:

@Scripts.Render("bundles/js/app")

if (User.IsInRole("Admin") {
  Scripts.Render("bundles/js/admin")
}

这样,它可以通过点亮特定于管理员的功能来逐步增强管理员的应用程序,从而增强普通用户的体验。

显然,最重要的防线仍然是控制器或操作上的[Authorize] 属性。没有任何 Razor 视图技巧或 JavaScript 恶作剧可以替代它。

【讨论】:

  • 这是我想到的一种方法。谢谢。我想问问这是不是个好主意。
【解决方案2】:

不通过模型也可以做到

@if (Request.IsAuthenticated && User.IsInRole("administrator"))

如果它是单页应用程序,则必须传递模型。如果黑客在 javascript 中将其角色更改为管理员,他们将看到点击按钮,但如果他们不是管理员,则无法对其进行任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2017-07-30
    • 2014-07-22
    • 1970-01-01
    • 2020-11-05
    相关资源
    最近更新 更多