如何处理一次性用户交互

时间:2011-12-20 21:43:03

标签: asp.net-mvc-3 ef-code-first

我正在开发一个由域模型(在其单独的项目中)和 MVC3 Web应用程序(再次在其自己的项目中)组成的解决方案。

在我的MVC3应用程序中,我列出了帖子(通过域上的存储库访问),每个帖子都有 like button ,当然还有域名Model,Post实体的属性为:

public int Likes { get; set; }

我想要允许的是我的网站(即访客)的访问者能够点击帖子上的“赞”按钮,但只能访问一次。这样他/她就能够发布一次的帖子。

实现这一目标的最佳方法是什么?饼干 ?保存数据库中的IP地址以及喜欢的帖子ID?或者其他一些方式?

我真的很困惑,因为无论我想到哪种方式,逻辑中总会出现漏洞,用户可以像帖子一样两次!

任何帮助都会很棒。

谢谢。

2 个答案:

答案 0 :(得分:0)

在此Q& A:https://softwareengineering.stackexchange.com/questions/94095/how-to-prevent-same-user-rating-a-web-content-like-video-more-than-once

中获得战利品

底线:绝对无法阻止多票,但如果有足够的开发工作,您可以部分降低风险。

答案 1 :(得分:0)

加密的cookie只能以他们无法修改的方式表示唯一用户(但是,他们可以删除)

public ActionResult Like()
{
    var cookie = Request.Cookies["SecureCookieName"].Value;
    if(!string.IsNullOrEmpty(cookie))
    {
        string plainTextGuid = Decrypt(cookie);
        if(_db.Likes.Any(l => l.UniqueID == plainTextGuid))
            return null;
    }

    // if you're here, this is a "new" user
    Guid guid = new Guid();

    // TODO: persist Like to database including unencrypted guid.ToString()

    // set cookie value to encrypted
    Request.Cookies["SecureCookieName"].Value = Encrypt(guid.ToString());

    // or whatever logic you need
    return null; 
}

EncryptDecrypt方法可以包括您选择的加密。