我希望按照我在这里找到的示例实现OWIN: http://www.asp.net/web-api/overview/security/individual-accounts-in-web-api
然而,由于这种工作方式对我来说是新的,特别是使用我自己创建的数据库,我想要一些指导。 我可以毫无问题地提交我的注册申请。
该帖子将我带到了AccountController:
X
这会触发以下代码:
[AllowAnonymous]
[Route("Register")]
public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
try {
var email = model.Email;
var password = model.Password;
var user = new users() {
Email = email,
PasswordHash = password,
Password = password
};
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
return Ok();
}
catch(Exception ex)
{
throw;
}
}
ApplicationUserManager:
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
但是出于某种奇怪的原因,我得到了
public class ApplicationUserManager : UserManager<users>
{
public ApplicationUserManager(IUserStore<users> store)
: base(store)
{
}
public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context)
{
var manager = new ApplicationUserManager(new UserStore<users>(context.Get<DaumAuctionEntities>()));
var dataProtectionProvider = options.DataProtectionProvider;
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = false,
RequireLowercase = true,
RequireUppercase = true,
};
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<users>(dataProtectionProvider.Create("ASP.NET Identity"));
}
return manager;
}
}
即使我不在任何地方使用名字?!这个名字来自哪里?
所以我认为我做错了什么但是如果没有关于如何用现有数据库实现OWIN的明确解释就很难调试。
在我的上下文/实体和用户表下面,我想用它来存储用户数据。
上下文:
modelState: {undefined: ["Name cannot be null or empty."]}
用户:IdentityUser:
public partial class DaumAuctionEntities : IdentityDbContext<users>
{
public DaumAuctionEntities()
: base("name=DaumAuctionEntities")
{
}
public DbSet<addresses> addresses { get; set; }
public DbSet<auctions> auctions { get; set; }
public DbSet<images> images { get; set; }
public DbSet<users> users { get; set; }
}
如果我在尝试调用CreateAsync之前将UserName添加回我的新用户对象,则错误消失但我得到另一个错误:
public partial class users : IdentityUser
{
public override string UserName
{
get
{
return Email;
}
set
{
Email = value;
}
}
override public string PasswordHash
{
get
{
return Password;
}
set
{
Password = value;
}
}
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<users> manager, string authenticationType)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
// Add custom user claims here
return userIdentity;
}
}
public partial class users
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public System.DateTime CreatedDate { get; set; }
public Nullable<System.DateTime> ModifiedDate { get; set; }
}
我在教程代码中也有这个问题!这只是.NET中一个棘手的错误?
我尝试进行覆盖,您可以在上面的部分类用户中看到。但我仍然有同样的错误。
答案 0 :(得分:0)
问题是由于我在调用UserManager.CreateAsync之前没有将UserName添加到我的新用户。如果我添加UserName,我会遇到与此完全相同的问题:MVC 5 IdentityDbContext and DbContext transactions
该问题似乎表明ASP.NET Identity在查询中使用UserName
属性,但Entity Framework认为该属性未映射到Entity模型(EDML)中的数据库列
答案 1 :(得分:0)
我没有看到您的代码存在很多问题
然后你应该没问题
此外,关于:
不,它确实通过了。它来自我相信经理但是 每当我尝试调试该代码时,调试器都会声明它跳转 在它上面(很可能是因为它是一个外部库 来自微软)。
如果使用try / catch包装调用,您将能够看到错误消息
答案 2 :(得分:0)
我在这里分享的代码几乎没有问题,但与你提到的完全不同。我在git上分享了这个例子供你参考。如果您发现任何问题,请亲自尝试并告诉我。
Git网址 - https://github.com/JitJDN/OWINStack
请参阅,代码仍与您的代码相同:
var email = model.Email; var password = model.Password;
var user = new users()
{
Email = email,
PasswordHash = password,
Password = password
};
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
if (!result.Succeeded)
{
return GetErrorResult(result);
}
return Ok();
答案 3 :(得分:0)
我终于明白了。
最后我不得不添加调整部分类Users(这是我的SQL数据库中的表),以便UserName和Password覆盖IDentityUser的字段(所以不像我在我的问题中所做的那样):
public partial class users
{
public int Id { get; set; }
public string UserName {get; set; }
public string Password { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime? CreatedDate { get; set; }
public DateTime? ModifiedDate { get; set; }
}
然后我在创建用户时只需传递密码和UserName:
var user = new users() {
Email = email,
UserName = email,
PasswordHash = password,
Password = password
};