使用Identity 2.x迁移MVC5中的匿名用户
本文关键字:用户 MVC5 Identity 迁移 使用 | 更新日期: 2023-09-27 17:52:58
我的问题与这个问题密切相关(然而,除非你阅读所有的评论和答案,否则你可能无法弄清楚):
ASP。. NET Identity 2支持匿名用户吗?
我只是想详细说明或问得更清楚一点。我的问题也是关于微软关于迁移匿名用户的文章:
https://msdn.microsoft.com/en-us/library/system.web.profile.profilemodule.migrateanonymous (v = vs.110) . aspx
我想最简单的问题是,MSDN文章是否仍然适用于迁移MVC5 Identity 2.X中的匿名用户?首先,它提到了这个:
<authentication mode="Forms" >
<forms loginUrl="login.aspx" name=".ASPXFORMSAUTH" />
</authentication>
然而,在我的网上。配置,我有这个(这是由我以外的东西添加的…我假设是Identity或项目模板。):
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
</modules>
我也在我的网站上使用这个。配置,似乎可以很好地处理匿名用户(它是由我添加的,并在MSDN文章中提到):
<anonymousIdentification enabled="true" />
从匿名到IsAuthenticated
有两种方式,注册或登录。
本质上,无论允许匿名用户做什么,我都抓住AnonymousID并将其放入具有相关信息的单独表中(例如CommentId => AnonymousID)。(理论上,一个用户可以已经注册并注销,但仍然是一个匿名用户……实际上是复制操作,当用户登录时再次迁移数据时需要考虑这一点,这样就不会创建副本。
我引用的那两个链接,也许还有其他几篇文章都涉及到这个主题,但没有什么是真正清楚或解释得很好的。关于第一个代码块,是否有一个新的authentication mode
?假设我们不再使用Forms
,我错了吗?MSDN的例子仍然有效吗?将匿名用户连同匿名用户可能链接到的任何其他表数据一起迁移到IsAuthenticated
的更好的示例(如果可能的话)或更当前的方法是什么?
谢谢。
更新1(第二天):这是我到目前为止的内容:全局的Profile_OnMigrateAnonymous
。Asax仍然在成功注册和登录事件时触发。注释被添加到示例中:
public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
{
//Anything regarding this profile stuff appears to not be relevant to Identity...
//... (and no using statements I can find will get rid of the squigglies...
//... Even if I get rid of the Profile error, GetProfile has problems.)
//ProfileCommon anonymousProfile = Profile.GetProfile(args.AnonymousID);
//More Profile stuff and not even relevant to what I'm doing...
//...and appears to be new fields you can add to the SimpleMembership Users table?
//...and also related to the properties you add in your web.config which are also...
//...not related to Identity.
//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.
//The ProfileManager line just hangs and barks about a network error...
//...but there is no network error (without a doubt)...
//...I have no idea what it would be deleting anyway.
//ProfileManager.DeleteProfile(args.AnonymousID);
//This is the only line that is successful and actually deletes the cookie.
AnonymousIdentificationModule.ClearAnonymousIdentifier();
//// Delete the user row that was created for the anonymous user.
// Except that no user was written to any user rows...
// ...Therefore, I didn't even bother trying this next line.
//Membership.DeleteUser(args.AnonymousID, true);
}
正如你所看到的,在msdn示例中只有一行似乎可以使用Identity(…)一般来说,cookie似乎也与身份无关。)事实上,我只得到Profile_OnMigrateAnonymous
和其他相关项目的少数搜索结果,包括国际结果,让我认为这不是一种流行的做事方式?simplememship似乎也对匿名用户进行了更彻底的考虑。实际上,匿名用户似乎根本没有想到Identity。
嗯…这是我能做的最好的事了,谁知道还能再杀多少天。我不会把它标记为公认的答案,因为我真的不觉得它是。我希望能在我死前完成这个项目(因为。net每天让我衰老1岁),我只能采用尼安德特人的方法,一步一步地完成它对我来说是有意义的。
我做的第一件事是创建一个唯一的约束(相同的两个数据块在同一个sql表中没有重复)。IncidentId和IUserId)在我的表上使用this:
CREATE UNIQUE NONCLUSTERED INDEX idx_incidentid_iuserid
ON Likes(IncidentId, IUserId)
在我的全局。Asax(不存在):
...
using System.Web.Security;
using Microsoft.AspNet.Identity;
using ProjectSender.Models;
...
...
public void Profile_OnMigrateAnonymous(object sender, ProfileMigrateEventArgs args)
{
ApplicationDbContext db = new ApplicationDbContext();
var anonymousUser = args.AnonymousID;
var identityUser = User.Identity.Name;
var identityUserId = User.Identity.GetUserId();
foreach (var item in db.Likes.Where(x => x.IUserId == anonymousUser).ToList())
{
//Try = Update anonymousId with identityUserId.
//Catch = Remove any duplicates caught by the exception/constraint
try
{
item.IUserId = identityUserId;
item.IUser = identityUser;
db.SaveChanges();
}
catch
{
db.Likes.Remove(item);
db.SaveChanges();
}
}
// Remove the anonymous cookie.
AnonymousIdentificationModule.ClearAnonymousIdentifier();
}
...
我认为抛出一个异常的约束可能不是最良心做的事情,但我只是不知道任何其他方式来执行。对于该用户,每个IncidentId最多只能有一个重复记录,因此看起来是可行的。但是,我想知道更好的方法。
希望这能帮助一些像我一样的可怜的迷失的灵魂。我很乐意听到任何其他的批评,陷阱,建议等等。谢谢。