C# 在ASP.NET MVC中加密以Json格式发送的数据
我希望通过JSON从SQL Server传递大量数据,这样我就可以从客户端对其进行Ajax调用。我刚刚开始使用Ajax,所以我正在做一些基本的示例——根据这些示例,人们可以很容易地查看(例如,在Fiddler中)发送的整个JSON。如何对传递的数据进行加密,以便视图可以使用它,但不会向公众公开?是否可行?如果可行,如何实现 下面是我在练习中使用的一些代码。如果我能从这个基本的例子中得到一些想法,或者被重定向到一本好的读物上,这两个选项都会非常有用 控制器C# 在ASP.NET MVC中加密以Json格式发送的数据,c#,json,ajax,asp.net-mvc,C#,Json,Ajax,Asp.net Mvc,我希望通过JSON从SQL Server传递大量数据,这样我就可以从客户端对其进行Ajax调用。我刚刚开始使用Ajax,所以我正在做一些基本的示例——根据这些示例,人们可以很容易地查看(例如,在Fiddler中)发送的整个JSON。如何对传递的数据进行加密,以便视图可以使用它,但不会向公众公开?是否可行?如果可行,如何实现 下面是我在练习中使用的一些代码。如果我能从这个基本的例子中得到一些想法,或者被重定向到一本好的读物上,这两个选项都会非常有用 控制器 public JsonResult Ou
public JsonResult OutputToJson() {
var students = _db.Students.ToList();
return Json(students, JsonRequestBehavior.AllowGet);
}
查看
$(文档).ready(函数(){
$('btnGetStudents')。单击(函数(){
$.getJSON(“/Student/OutputToJson”),null,函数(数据){
var div=$(“#AjaxDiv”);
$。每个(数据、功能(i、项){
div.append(“行:+i+”名称:+item.name+”,级别:+item.grade)
})
})
})
})
答案很简单:客户的一切都应该是公开的,客户可以使用
您不应该在客户端实现任何“加密”,老实说,您将无法做到这一点,因为客户端也可以读取您的JavaScript,包括加密算法和密钥
您应该只向您的视图提供公共数据,这样您就不会为其披露而烦恼
可以创建ViewModel并传递它。视图模型仅表示要在视图/页面上显示的数据。例如,根据您的数据模型和业务逻辑,实现类
StudentViewModel
,该类与Student
相同,但仅具有公共字段:
public class Student { /* Shouldn't be disclosed */
public int Id { get; set; }
public int Grade { get; set; }
public string PasswordHash { get; set; }
public string Email { get; set; }
}
public class StudentViewModel { /* Why should I be worried about ids and grades? */
public int Id { get; set; }
public int Grade { get; set; }
}
然后,您可以安全地返回
StudentViewModel
数组,而不用担心它。用户将在他的HTML中看到ID和等级,如果他查看开发人员工具网络日志,他将看到ID和等级,其他什么都看不到。答案很简单:客户端的所有内容都应该是公开的,并且对客户端可用
您不应该在客户端实现任何“加密”,老实说,您将无法做到这一点,因为客户端也可以读取您的JavaScript,包括加密算法和密钥
您应该只向您的视图提供公共数据,这样您就不会为其披露而烦恼
可以创建ViewModel并传递它。视图模型仅表示要在视图/页面上显示的数据。例如,根据您的数据模型和业务逻辑,实现类
StudentViewModel
,该类与Student
相同,但仅具有公共字段:
public class Student { /* Shouldn't be disclosed */
public int Id { get; set; }
public int Grade { get; set; }
public string PasswordHash { get; set; }
public string Email { get; set; }
}
public class StudentViewModel { /* Why should I be worried about ids and grades? */
public int Id { get; set; }
public int Grade { get; set; }
}
然后,您可以安全地返回
StudentViewModel
数组,而不用担心它。用户将在其HTML中看到ID和等级,如果他查看开发人员工具网络日志,他将看到ID和等级,而不是其他内容。我建议使用ssl进行通信。确保http连接是安全的,即它是http so(安全的)。并启用某种形式的身份验证,以确保除了目标用户(已验证)之外,没有人可以调用webapi调用来检索数据
这样,任何拦截请求的人都不能以纯文本的形式查看数据
这可能仅仅是配置web应用程序(即,没有代码更改)的问题,您的JavaScript代码也绝对没有更改
请查看以下内容,以获取有关保护webapi的更多详细信息
我建议使用ssl进行通信。确保http连接是安全的,即它是http so(安全的)。并启用某种形式的身份验证,以确保除了目标用户(已验证)之外,没有人可以调用webapi调用来检索数据 这样,任何拦截请求的人都不能以纯文本的形式查看数据 这可能仅仅是配置web应用程序(即,没有代码更改)的问题,您的JavaScript代码也绝对没有更改 请查看以下内容,以获取有关保护webapi的更多详细信息
您所展示的示例显示了您在视图中返回的json数据,那么加密它有什么意义呢?这里我只传递了部分数据,但如果我感知整个数据库,那就像是将其送出,这是我不想做的。为什么要发送视图不使用的数据来降低应用程序的性能?只需发送您在视图中显示的数据-
var data=students.Select(s=>new{Name=s.Name,Grade=s.Grade});返回Json(数据,…)代码>这是一个很好的观点,和其他观点一样-让我很清楚应该关注什么。谢谢你,Stephen。你展示的示例显示了你在视图中返回的json数据,那么加密它有什么意义呢?这里我只传递了部分数据,但如果我感知整个数据库,那就像是把它泄露出去,这是我不想做的。为什么要发送视图不使用的数据来降低应用程序的性能?只需发送您在视图中显示的数据-var data=students.Select(s=>new{Name=s.Name,Grade=s.Grade});返回Json(数据,…)代码>这是一个很好的观点,和其他观点一样-让我很清楚应该关注什么。谢谢你,史蒂芬。谢谢你,这也是另一件需要考虑的事情。谢谢,这也是另一件需要考虑的事情。