ASP.NET 身份 - 使用具有 JavaScript 功能的角色

ASP.NET Identity - Using Roles with JavaScript Functionality

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

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

[Authorize(Roles = "Admin")]

这还不够,因为仍将调用此控制器和方法,并为那些不属于 "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 
        }
    });
});

我想围绕单击事件对此做一些总结...

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

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

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

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

不通过模型也可以做到

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

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

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

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

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

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

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