【问题标题】:How to pass ASP.NET user and route data to JavaScript?如何将 ASP.NET 用户和路由数据传递给 JavaScript?
【发布时间】:2017-03-13 05:44:43
【问题描述】:

我有一些关于 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 注入脚本(谁知道)等。
  • 有关实施的一些信息会向最终用户披露

什么是正确且安全的方法?

【问题讨论】:

标签: javascript c# asp.net-mvc


【解决方案1】:

从两年多的经验来看我自己未回答的问题,我会说使用 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 攻击。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2019-03-03
    • 2015-10-15
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-18
    • 2019-04-01
    相关资源
    最近更新 更多