gpt4 book ai didi

c# - 使用 Identity 2.x 在 MVC5 中迁移匿名用户

转载 作者:太空宇宙 更新时间:2023-11-03 15:39:58 24 4
gpt4 key购买 nike

我的问题与这个问题密切相关(但是,除非您阅读那里的所有评论和答案,否则您可能无法弄清楚):

Does ASP.NET Identity 2 support anonymous users?

我只是想详细说明或问得更清楚一点。我的问题也是关于这篇关于迁移匿名用户的 Microsoft 文章:

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>

但是,在我的 web.config 中,我有这个(这是由我以外的其他人添加的......我假设身份或项目模板。):

<system.webServer>
<modules>
<remove name="FormsAuthentication" />
</modules>

我也在我的 web.config 中使用它,它似乎可以很好地处理匿名用户(它是由我添加的,并在 MSDN 文章中提到):

<anonymousIdentification enabled="true" />

从匿名到 IsAuthenticated 有两种方法,注册或登录。

本质上,无论匿名用户被允许做什么,我都会获取 AnonymousID 并将其放入一个包含相关信息的单独表中(例如 CommentId => AnonymousId)。 (理论上,用户可能已经注册并注销并仍然充当匿名用户......本质上是重复操作,当用户登录时再次迁移数据时需要考虑这一点,这样它就不会创建重复项.)

我引用的这两个链接和其他几篇文章可能都涉及到这个主题,但没有什么是真正清楚或解释清楚的。关于第一段代码,是否有新的认证模式?我假设我们还没有使用 Forms 是不是错了? MSDN 示例是否仍然有效?将匿名用户迁移到 IsAuthenticated 以及匿名用户可能链接到的任何其他表数据的更好示例(如果可能)或更新的方法是什么?

谢谢。

更新 1(第二天):这是我到目前为止的内容:Global.asax 中的 Profile_OnMigrateAnonymous 仍然会在成功注册和登录事件时触发。示例中添加了注释:

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 似乎也与 Identity 无关。)事实上我只得到了少数Profile_OnMigrateAnonymous 的搜索结果以及与此相关的其他项目(包括国际结果)让我觉得这不是一种流行的做事方式?似乎 SimpleMembership 可能已经让匿名用户考虑得更彻底一些?实际上,匿名用户似乎根本没有想到身份。

最佳答案

嗯...这是我在不杀人的情况下所能做的最好的事情,谁知道还有多少天。我不会将其标记为已接受的答案,因为我真的不觉得它是。希望在我死之前的某个时候完成这个项目(因为 .NET 让我每天老化 1 年左右),我只需要采用尼安德特人的方法并逐步完成这个对我来说有意义的方法。

我做的第一件事是在我的表上创建一个唯一约束(在同一个 sql 表中没有重复的两条数据,即 IncidentId 和 IUserId):

    CREATE UNIQUE NONCLUSTERED INDEX idx_incidentid_iuserid
ON Likes(IncidentId, IUserId)

在我的 global.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 最多只能有一个重复记录,因此它看起来很适合。不过,我很想知道更好的方法。

希望这能帮助像我这样迷失的可怜人。我很乐意听到任何其他批评、问题、建议等。谢谢。

关于c# - 使用 Identity 2.x 在 MVC5 中迁移匿名用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30594072/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com