如何将ASP.NET用户和路由数据传递给JavaScript?

时间:2016-10-31 05:44:21

标签: javascript c# asp.net-mvc

我在ASP.NET中有一些关于用户和路由的数据 如何在JavaScript中使用它?

目前,我在_Layout.cshtml文件中有以下行:

@{ Html.RenderAction("ContextScript", "WebParts"); }

ContextScript是一个返回以下部分视图的操作:

<script id="context-script">
    var context = {
        controller: "@Request.RequestContext.RouteData.Values["controller"]",
        action: "@Request.RequestContext.RouteData.Values["action"]",
        area: "@Request.RequestContext.RouteData.Values["area"]",
        culture: "@Request.RequestContext.RouteData.Values["culture"]",
        isMobile: @Request.Browser.IsMobileDevice.ToString().ToLower(),
        rootUrl: "@BaseMulticultureHttpApplication.RootApplicationUrl",
        isAuthenticated: @User.Identity.IsAuthenticated.ToString().ToLower(),
        username: "@(User.Identity.IsAuthenticated ? User.Identity.Name : "")",
        isBankClient: @(User.Identity.IsAuthenticated ? User.Identity.AcquireUser().BankClientID.HasValue.ToString().ToLower() : "false"),
        iin: "@(User.Identity.IsAuthenticated ? User.Identity.AcquireUser().IIN : "")",
        fullname: "@(User.Identity.IsAuthenticated ? User.Identity.AcquireUser().FullName : "")"
    };
</script>

然后,这个context正在被许多捆绑的脚本读取。

但是,我坚信自从以来有更好的选择:

  • 用户和路线信息在全球范围内可用,污染它并使context可用于恶意浏览器插件,XSS注入脚本(谁知道)等。
  • 有关实施的一些信息已向最终用户披露

这是一种正确而安全的方法吗?

1 个答案:

答案 0 :(得分:0)

从两年以上的经验来看我自己的未解决问题,我会说使用AJAX可能是最合适的解决方案:

可以直接注入RouteData:

<script id="context-script">
    var context = {
        controller: "@Request.RequestContext.RouteData.Values["controller"]",
        action: "@Request.RequestContext.RouteData.Values["action"]",
        area: "@Request.RequestContext.RouteData.Values["area"]",
        culture: "@Request.RequestContext.RouteData.Values["culture"]",
        isMobile: @Request.Browser.IsMobileDevice.ToString().ToLower()
    };
</script>

但是用户数据应作为API公开:

// ASP.NET -> Models
public class CurrentUserModel
{
    public CurrentUserModel(...) 
    {
        // initialize properties
    }

    public bool IsAuthenticated { get; }

    public string Username { get; }

    // other properties go here
}

// ASP.NET -> Controllers
public class UserController : ApiController 
{
    // GET /user/current
    [HttpGet] 
    [AllowAnonymous]
    public async Task<CurrentUserModel> Current()
    {
        CurrentUserModel model = new CurrentUserModel(...);
        return Ok(model);            
    }
}

// Client-side
<script>
    apiClient.user.current().then(u => {
        // work with user details here
    });
</script>

GET操作在这里用作REST风格的示例。需要其他安全注意事项。例如,如果您的API托管在同一个域上,并且使用cookie进行身份验证,则可以考虑应用AntiForgeryToken或切换到POST方法来防御CSRF攻击。