使用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。

使用Identity 2.x迁移MVC5中的匿名用户

嗯…这是我能做的最好的事了,谁知道还能再杀多少天。我不会把它标记为公认的答案,因为我真的不觉得它是。我希望能在我死前完成这个项目(因为。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最多只能有一个重复记录,因此看起来是可行的。但是,我想知道更好的方法。

希望这能帮助一些像我一样的可怜的迷失的灵魂。我很乐意听到任何其他的批评,陷阱,建议等等。谢谢。