Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何通过特定行';将ID从控制器添加到视图,然后再从视图添加到控制器?_Asp.net Mvc_Session_Asp.net Identity - Fatal编程技术网

Asp.net mvc 如何通过特定行';将ID从控制器添加到视图,然后再从视图添加到控制器?

Asp.net mvc 如何通过特定行';将ID从控制器添加到视图,然后再从视图添加到控制器?,asp.net-mvc,session,asp.net-identity,Asp.net Mvc,Session,Asp.net Identity,首先,非常感谢你的帮助。我真的不知道如何在谷歌上写这篇文章,所以它在这里。我现在关心的是我在我的web应用程序中实现的一种方法。我正在使用带有EF6和Identity 2的ASP.NET MVC 5 在很多情况下,我需要将特定的行ID从视图传递到控制器。我想到的最好的方法是把它放入一个加密的隐藏表单中 以下是我正在使用的代码: public class StringEncrypt : IEncrypt { public Func<string> GetUserID;

首先,非常感谢你的帮助。我真的不知道如何在谷歌上写这篇文章,所以它在这里。我现在关心的是我在我的web应用程序中实现的一种方法。我正在使用带有EF6和Identity 2的ASP.NET MVC 5

在很多情况下,我需要将特定的行ID从视图传递到控制器。我想到的最好的方法是把它放入一个加密的隐藏表单中

以下是我正在使用的代码:

 public class StringEncrypt : IEncrypt
{

    public Func<string> GetUserID;
    public StringEncrypt()
    {
        GetUserID = () => HttpContext.Current.User.Identity.GetUserId();
    }

    private string Purpose = "The authentication token is";

    public string Protect(string unprotectedText)
    {
        var unprotectedBytes = Encoding.UTF8.GetBytes(unprotectedText);
        var protectedBytes = MachineKey.Protect(unprotectedBytes, Purpose + GetUserID);
        var protectedText = Convert.ToBase64String(protectedBytes);
        return protectedText;
    }

    public string Unprotect(string protectedText)
    {
        var protectedBytes = Convert.FromBase64String(protectedText);
        var unprotectedBytes = MachineKey.Unprotect(protectedBytes, Purpose + GetUserID);
        var unprotectedText = Encoding.UTF8.GetString(unprotectedBytes);
        return unprotectedText;
    }
}
公共类StringEncrypt:IEncrypt
{
public Func GetUserID;
公共字符串加密()
{
GetUserID=()=>HttpContext.Current.User.Identity.GetUserID();
}
private string Purpose=“身份验证令牌为”;
公共字符串保护(字符串未保护文本)
{
var unprotectedBytes=Encoding.UTF8.GetBytes(unprotectedText);
var protectedBytes=MachineKey.Protect(unprotectedBytes,Purpose+GetUserID);
var protectedText=Convert.ToBase64String(protectedBytes);
返回protectedText;
}
公共字符串取消保护(字符串保护文本)
{
var protectedBytes=Convert.FromBase64String(protectedText);
var unprotectedBytes=MachineKey.Unprotect(protectedBytes,Purpose+GetUserID);
var unprotectedText=Encoding.UTF8.GetString(unprotectedBytes);
返回未受保护的文本;
}
}
稍后,我会将它们放回控制器中,并检查是否存在任何完整性问题

有人建议我避免使用

不幸的是,他们还建议我使用Session[],这与下面的文章不谋而合:

这意味着我应该避免使用Session[]

此外,这一评论很有意义:

请注意,当有人试图在不同选项卡中同时编辑多个表单时,会话可能会引入错误。当他们保存一个会话时,获取的会话值将是他们加载到要保存的最后一个会话的值。。。很可能不是你想要的,而且很难弄清楚这一点

从这里开始:

推荐的方法是什么


万分感谢

我不明白你到底想做什么。如果是身份验证,则使用内置库(例如,标识包含有关您和密码的信息,但它位于服务器端加密的cookie中,因此对于客户端来说就像一个黑盒子)。否则,您不应该在表单元素中放置敏感的内容。要做的不是将其移动到会话中,而是验证用户是否有权访问他正在更改的任何记录;如果是这样的话,那么通过改变页面来“黑客”只是一种迂回的方式,他已经被允许这么做了。谢谢@Casey。我想要的是以一种非常有效的方式跟踪某些元素的行id。想象一下,如果我有一个订单,该订单有一个客户ID、一个产品ID和一个用户ID。我可以通过Identity的Cookie获取用户ID。但是,在一个断开连接的场景中,如何将产品ID和客户ID从视图传递到控制器,这让我陷入了困境。那么,您所做的是正确的。使用隐藏的表单元素。是的,确实有人可以通过修改这些数字来改变他们发送给你的内容。但是,如果您确保他们只能使用他们应该有权访问的产品和客户端ID来实现这一点,那么他们所能做的就是创建一种乏味的方式,按照您的预期使用应用程序。太棒了!10亿谢谢你,凯西!我应该始终对数据库中的每个值执行检查,以防止同一数据库中出现垃圾。