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

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

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

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

ASP.NET Identity甚至是正确的解决方案吗?

这些之间有什么区别:

  • ASP.NET身份
  • SimpleMembership
  • 会员提供者

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

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

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

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

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

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

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

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

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

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

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

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

但是,您仍然可以判断用户是否已通过身份validation。 考虑这个示例控制器和方法:

 [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到aspnet身份 。 您肯定希望在Web应用程序中使用ASP.NET标识。


更新查看此示例代码,这将帮助您在将post记录到数据库时区分尚未注册的用户。

 [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); } } 

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

它并不完美…如果你的用户清除了你的身份,你就会失去识别身份的能力,但这可能是你能做到的最好的。

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

 public class PostController : Controller { [HttpGet] public ActionResult Index(string text) { if (string.IsNullOrWhiteSpace(text)) return Content("Please specifiy a value for text. ie /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 – 设置自定义IIdentity或IPrincipal以获取有关设置自定义IPrincipal更多信息。

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

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

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

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

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

迁移匿名配置文件的最佳方式

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); }