ASP.NET Identity 2是否支持匿名用户?

时间:2014-04-21 19:03:15

标签: c# asp.net-mvc asp.net-mvc-5 asp.net-identity

我想允许匿名/尚未注册和注册的用户在我的网站上发帖。

Posts (table)
- Id (int)
- Subject (nvarchar)
- Body (nvarchar)
- UserId (uniqueidentifier)

该项目使用最新的MS技术(ASP.NET MVC 5 +,C#...)我该怎么做呢?

ASP.NET Identity是否是正确的解决方案?

这些之间的区别是什么:

  
      
  • ASP.NET标识
  •   
  • SimpleMembership
  •   
  • 会员提供者
  •   

更新 我需要能够区分尚未注册的用户并在数据库中记录他们的帖子。

更新2 然后可以选择迁移到已注册的帐户。就像stackoverflow用于允许匿名用户一样。 这样的东西,但与ASP.NET Identitfy兼容 http://msdn.microsoft.com/en-us/library/ewfkf772(v=vs.100).aspx

5 个答案:

答案 0 :(得分:4)

ASP.NET Identity是ASP.NET中最新的身份验证修订版。它的前身是SimpleMembership,它本身就是为了改进旧的ASP.NET Auth。成员资格提供程序不是一种单独的身份验证系统,而是一种通过其他功能引导ASP.NET Auth或SimpleMembership的方法。如果您有默认值未涵盖的特定登录方案,则可以创建一个允许ASP.NET与该系统连接的成员资格提供程序。

ASP.NET身份取代其他所有内容,并且不使用成员资格提供程序。相反,它为身份验证提供了一个非常可扩展的基础,通过使用标准API,您可以以任何您喜欢的方式自定义身份验证。它还为OAuth和外部登录提供程序提供了更强大的支持,并且可以更好地与Active Directory之类的接口进行接口,尤其是云中的Azure版本。

如果您正在开始新项目,请使用Identity。对于可预见的未来而言,它将继续存在,这与微软过去认为的每周一次的身份验证方法有点危险,但根据我个人使用它的经验,他们似乎终于做对了。我认为你只会看到未来的改进和改进,而不是完全替换。

答案 1 :(得分:4)

我想回答一个原始问题:“我需要能够区分尚未注册的用户并在数据库中记录他们的帖子。”。

之前我使用过Simple Membership,而且我使用的是Asp.Net Identity Framework 2.2.1。在这两种情况下,我都使用匿名标识来区分尚未注册的用户和经过身份验证的用户。

  1. 通过添加<anonymousIdentification enabled="true" cookieName="YOUR_COOKIE_FOR_ANONYMOUS_IDENTIFICATION" />
  2. 在您的Web.config中启用匿名身份验证
  3. 您可以通过Request.AnonymousID获取匿名ID。该id是字符串格式的GUID。
  4. 正如其他用户所提到的,您可以使用您想要的任何身份系统,只需记住在注销过程中清除匿名ID。通常在用户成功通过身份验证后,将带有anonymousId的username / userId保存到持久性存储中。通过在用户注销时清除anonymousId,您可以确保其他经过身份验证的用户无法与同一个anonymousId关联。
  5. 您可以按AnonymousIdentificationModule.ClearAnonymousIdentifier()清除anonymousId。注意:AnonymousIdentificationModule位于System.Web.Security程序集中。您可以添加System.Web的引用或使用CTRL +“。”在代码中的AnonymousIdentificationModule上引入System.Web.Security。

答案 2 :(得分:1)

ASP.NET Identity是一个灵活的框架,用于处理Web App中的用户身份验证。它非常棒,我强烈建议您继续在项目中使用它。

Identity本身并不支持匿名用户......相反,它是一个允许您管理经过身份验证的用户的框架。身份将允许您维护本地用户,或者如果您需要,通过外部服务(例如,Facebook或Google)对您的Web应用程序进行身份验证的用户。

听起来您希望未经过身份验证的用户可以访问您的部分网络应用。您实现这一目标的方式是通过ASP.NET控制器上的属性。

[Authorize]属性添加到Controller或Controller方法将告诉MVC确保用户经过身份验证和授权。但是,要允许匿名用户,只需将[AllowAnonymous]属性放在要为其提供公共访问权限的方法上。

但是,您仍然可以判断用户是否经过身份验证。考虑这个样本控制器和方法:

[Authorize]
public class PostController : Controller
{
    [AllowAnonymous]
    public ActionResult Index()
    {
        var isAuthenticated = User.Identity.IsAuthenticated;

        return View();
    }
}

isAuthenticated会告诉您当前用户是否已登录,如果是,则可以从User.Identity对象获取更多信息。


关于成员框架之间差异的一般性问题,我将遵循官方文档,该文档对差异进行了全面概述:http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity。您肯定希望在Web应用程序中使用ASP.NET Identity。


<强>更新 查看此示例代码,这将有助于您在将帖子记录到数据库时区分尚未注册的用户。

[Authorize]
public class PostController : Controller
{
    [AllowAnonymous]
    public HttpStatusCodeResult CreatePost(string postText)
    {
        // Use ASP.NET Identity to see if the user is logged in.  
        // If they are, we can get their User Id (blank otherwise)
        var isAuthenticated = User.Identity.IsAuthenticated;
        var userId = "";
        if (isAuthenticated)
            userId = User.Identity.GetUserId();

        // Create a new post object
        var post = new
        {
            PostText = postText,
            Anonymous = !isAuthenticated,
            UserId = userId
        };

        // Save the post to the database here

        return new HttpStatusCodeResult(HttpStatusCode.OK);
    }
}

答案 3 :(得分:1)

您可以通过使用基于cookie的身份验证方法来解决此问题。浏览器会根据每个Web请求发送与您的域相关联的任何Cookie,因此它们是处理身份验证的简便方法。这里的想法是,我们将有一个名为ident的cookie,它将存储我们生成的用户ID。我使用的是Guids,但您可以轻松地在数据库中创建一个条目。当我们收到Web请求时,查看cookie是否存在。如果是,我们在cookie中有他们的用户ID。否则,为它们生成新的用户ID并设置cookie。

它并不完美......如果您的用户清除了Cookie,您就会失去识别它的能力,但它可能是您能做到的最佳选择。

这里有一些可以放入项目并使用的代码:

public class PostController : Controller
{
    [HttpGet]
    public ActionResult Index(string text)
    {
        if (string.IsNullOrWhiteSpace(text))
            return Content("Please specifiy a value for text.  i.e. /Post/Index?text=Message");

        var message = "";

        var isAuthenticated = Request.Cookies["ident"] != null;
        if (isAuthenticated)
        {
            var userId = Request.Cookies["ident"].Value;
            var post = new
            {
                Text = text,
                User = userId
            };
            // Save to database here
            message = "You are a previously recognized user, with UserId=" + userId;
        }
        else
        {
            var userId = Guid.NewGuid().ToString();
            var identCookie = new HttpCookie("ident", userId);
            Response.Cookies.Add(identCookie);

            var post = new
            {
                Text = text,
                User = userId
            };
            // Save to database
            message = "You are a new anonymous user. Your new UserId=" + userId;
        }

        return Content(message);
    }
}

如果你最终走了这条路线并想要在多个请求中重用这个逻辑,我强烈建议将它抽象到一个实用程序类中,或者更好地覆盖IPrincipal User属性。控制器。请查看[此处] ASP.NET MVC - Set custom IIdentity or IPrincipal,了解有关设置自定义IPrincipal的详细信息。

答案 4 :(得分:1)

ASP.NET Identity系统旨在取代以前的ASP.NET成员资格和简单成员资格系统。 它包括配置文件支持 ,OAuth集成,可与OWIN配合使用,并随Visual Studio 2013附带的ASP.NET模板一起提供

ASP.NET用户配置文件功能旨在提供当前用户特有的信息。配置文件可以与经过身份验证的用户或匿名(未经身份验证的)用户一起使用。

在某些情况下,您的应用程序最初可能会为匿名用户维护个性化信息,但最终用户会登录到您的应用程序。在这种情况下,用户的身份从分配的匿名用户身份变为身份验证过程提供的身份。

当用户登录时(即,当他们不再是匿名用户时),将引发MigrateAnonymous事件。如有必要,您可以处理此事件以将信息从用户的匿名身份迁移到新的身份验证身份。

http://msdn.microsoft.com/en-us/library/vstudio/ewfkf772(v=vs.100).aspx

Best way to Migrate Anonymous Profile

http://odetocode.com/articles/440.aspx

public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
{
  ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);

  Profile.ZipCode = anonymousProfile.ZipCode;
  Profile.CityAndState = anonymousProfile.CityAndState;
  Profile.StockSymbols = anonymousProfile.StockSymbols;

  ////////
  // Delete the anonymous profile. If the anonymous ID is not 
  // needed in the rest of the site, remove the anonymous cookie.

  ProfileManager.DeleteProfile(args.AnonymousID);
  AnonymousIdentificationModule.ClearAnonymousIdentifier(); 

  // Delete the user row that was created for the anonymous user.
  Membership.DeleteUser(args.AnonymousID, true);

}