我在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注入脚本(谁知道)等。这是一种正确而安全的方法吗?
答案 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攻击。