我很沮丧。我会尽量具体。
在身份验证方面,我有点像菜鸟,虽然我设法从this link完成整个身份/ Owin设置教程
正如我所说,我设法在一个单独的项目中完成它,我创建它只是为了遵循教程,它运行良好。
现在,当我尝试将我在实际项目中学到的东西与我在教程中使用的完全相同的代码进行整合时,问题就出现了。这个项目的不同之处在于我将我的解决方案分为三个项目,即BusinessLayer,DataObjects和UI。在这个解决方案中,我无法从本教程的第一部分,只是“基础知识”部分传递,我应该在其中添加具有硬编码值的用户。
这就是我所拥有的。在DataObjects项目中,我有一个“IdentityModel.cs”,我扩展了IdentityUser和IdentityDbContext类。它看起来像这样:
public class ApplicationUser : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int AccountTypeId { get; set; }
public DateTime CreatedOn { get; set; }
public string CreatedBy { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext() : base("AdsTracker_DevEntities")
{
}
}
“AdsTracker_DevEntities”是我的connectionstring的名称,它在DataObjects项目的web.config中声明。然后,在BusinessLayer项目中,我有一个名为“ProjectStart”的文件夹。在这个文件夹中,我有一个“IdentityConfig.cs”,其中包含以下代码:
public class ApplicationUserStore : UserStore<ApplicationUser>
{
public ApplicationUserStore(ApplicationDbContext context) : base(context)
{
}
}
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store)
{
}
}
然后,我在UI项目中有一个控制器,它只是在BusinessLayer中调用“CreateUser”函数。 CreateUser函数如下所示:
public async Task<string> AddUser()
{
ApplicationUser user;
ApplicationUserStore Store = new ApplicationUserStore(new ApplicationDbContext());
ApplicationUserManager userManager = new ApplicationUserManager(Store);
user = new ApplicationUser
{
FirstName = "Lilian",
LastName = "Cobian",
AccountTypeId = 1,
UserName = "test.test",
Email = "prueba@gfrmedia.com",
CreatedOn = DateTime.Now
};
var result = await userManager.CreateAsync(user, "P@ssword");
if (!result.Succeeded)
{
return result.Errors.First();
}
return "User Added";
}
就是这样。现在,行为是什么?如果我添加一个用户名为“test.test”的用户,则“await userManager.CreateAsync(user,”P @ ssword“);”代码是“成功的”,但是当我去检查数据库时,没有插入任何内容。现在,如果我再次调用该函数,并且我尝试添加相同的用户,则会返回错误“User name has already”。再次,我去了数据库,根本没有记录!怎么可以?
这就是奇怪的部分。在我为了遵循教程而创建的唯一项目中,一切都很好,并且记录被添加到数据库中,但是当我尝试将它集成到我的真实项目中时,它的行为就像我提到的那样。
可能是因为connectionstring是在DataObjects项目的web.config中而不是在BusinessLayer中声明的?但是,为什么以及如何“知道”我已经添加了“test.test”用户,如果db中没有任何记录?
拜托,这让我发疯了。任何帮助将不胜感激。
谢谢!!!
答案 0 :(得分:1)
我终于解决了我的问题。它正在写入位于AppData文件夹中的localdb,.mdf。根据我们收到的一些建议,我重新检查了我的web.config。问题是我向DataObjects项目添加了一个.edmx,指向正确的SQL数据库,后者又将连接字符串添加到正确的数据库中,但我从未将连接字符串添加到UI web.config文件中。 UI是主要项目,因此它的web.config似乎也需要正确的连接字符串。
答案 1 :(得分:-1)
我认为它已经插入到数据库中了,也许你检查错误的表,使用Microsoft Identity它会插入一个以identity
开头的特殊表名或类似的东西。
顺便说一句,这个Identity
事情很糟糕,很复杂,没用,失去控制。它浪费了我的一些时间,然后我发现认证只是一个cookie读写的东西,如果你自己,你会重生,更多google this。