gpt4 book ai didi

asp.net-mvc - 与Microsoft.AspNet.Identity的自定义成员身份-CreateLocalUser失败

转载 作者:行者123 更新时间:2023-12-03 11:43:09 25 4
gpt4 key购买 nike

我一直在尝试使用Visual Studio 2013在ASP.NET 4.5(Microsoft.AspNet.Identity)中实现自定义版本的新身份功能。经过数小时的研究,我在一个努力使其正常运行。我在下面列出了我的代码。进行本地注册时,将创建数据库表,但是CreateLocalUser方法失败。我希望有人可以帮助我确定所需的更改。

型号/成员(member)模型.cs

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace thePulse.web.Models
{
public class PulseUser : IUser
{
public PulseUser() { }
public PulseUser(string userName)
{
UserName = userName;
}

[Key]
public string Id { get; set; }
[Required]
[StringLength(20)]
public string UserName { get; set; }
[StringLength(100)]
public string Email { get; set; }
[Column(TypeName = "Date")]
public DateTime? BirthDate { get; set; }
[StringLength(1)]
public string Gender { get; set; }
}

public class PulseUserClaim : IUserClaim
{
public PulseUserClaim() { }

[Key]
public string Key { get; set; }
public string UserId { get; set; }
public string ClaimType { get; set; }
public string ClaimValue { get; set; }

}

public class PulseUserSecret : IUserSecret
{
public PulseUserSecret() { }
public PulseUserSecret(string userName, string secret)
{
UserName = userName;
Secret = secret;
}

[Key]
public string UserName { get; set; }
public string Secret { get; set; }

}

public class PulseUserLogin : IUserLogin
{
public PulseUserLogin() { }
public PulseUserLogin(string userId, string loginProvider, string providerKey)
{
LoginProvider = LoginProvider;
ProviderKey = providerKey;
UserId = userId;
}

[Key, Column(Order = 0)]
public string LoginProvider { get; set; }
[Key, Column(Order = 1)]
public string ProviderKey { get; set; }
public string UserId { get; set; }
}

public class PulseRole : IRole
{
public PulseRole() { }
public PulseRole(string roleId)
{
Id = roleId;
}

[Key]
public string Id { get; set; }
}

public class PulseUserRole : IUserRole
{
public PulseUserRole() { }

[Key, Column(Order = 0)]
public string RoleId { get; set; }
[Key, Column(Order = 1)]
public string UserId { get; set; }
}

public class PulseUserContext : IdentityStoreContext
{
public PulseUserContext(DbContext db) : base(db)
{
Users = new UserStore<PulseUser>(db);
Logins = new UserLoginStore<PulseUserLogin>(db);
Roles = new RoleStore<PulseRole, PulseUserRole>(db);
Secrets = new UserSecretStore<PulseUserSecret>(db);
UserClaims = new UserClaimStore<PulseUserClaim>(db);
}
}

public class PulseDbContext : IdentityDbContext<PulseUser, PulseUserClaim, PulseUserSecret, PulseUserLogin, PulseRole, PulseUserRole>
{
}
}

对Controllers / AccountController.cs的更改
public AccountController() 
{

IdentityStore = new IdentityStoreManager(new PulseUserContext(new PulseDbContext()));
AuthenticationManager = new IdentityAuthenticationManager(IdentityStore);
}

//
// POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
try
{
// Create a profile, password, and link the local login before signing in the user
PulseUser user = new PulseUser(model.UserName);
if (await IdentityStore.CreateLocalUser(user, model.Password))
{
await AuthenticationManager.SignIn(HttpContext, user.Id, isPersistent: false);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "Failed to register user name: " + model.UserName);
}
}
catch (IdentityException e)
{
ModelState.AddModelError("", e.Message);
}
}

// If we got this far, something failed, redisplay form
return View(model);
}

如上文所述,当CreateLocalUser方法失败(Microsoft.AspNet.Identity.EntityFramework)时,此实现将失败。我不知道为什么。

最佳答案

这里的问题是IdentityStoreManager对身份EF模型的默认实现有很强的依赖性。例如,CreateLocalUser方法将创建UserSecret和UserLogin对象,并将它们保存到商店中,如果商店未使用默认模型类型,则该对象将不起作用。因此,如果您自定义模型类型,则无法与IdentityStoreManager一起顺利使用。

由于您仅自定义IUser模型,因此我简化了代码以从默认身份用户继承自定义用户,并重用身份EF模型中的其他模型。

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace WebApplication11.Models
{
public class PulseUser : User
{
public PulseUser() { }
public PulseUser(string userName) : base(userName)
{
}

[StringLength(100)]
public string Email { get; set; }
[Column(TypeName = "Date")]
public DateTime? BirthDate { get; set; }
[StringLength(1)]
public string Gender { get; set; }
}

public class PulseUserContext : IdentityStoreContext
{
public PulseUserContext(DbContext db) : base(db)
{
this.Users = new UserStore<PulseUser>(this.DbContext);
}
}

public class PulseDbContext : IdentityDbContext<PulseUser, UserClaim, UserSecret, UserLogin, Role, UserRole>
{
}
}

上面的代码应与Identity API的预览版一起使用。

即将发布的版本中的IdentityStoreManager API已经知道此问题,并将所有非EF依赖项代码更改为基类,以便您可以通过从其继承而对其进行自定义。它应该解决这里的所有问题。谢谢。

关于asp.net-mvc - 与Microsoft.AspNet.Identity的自定义成员身份-CreateLocalUser失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17911430/

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