C# 使用现有数据库名称验证实现OWIN?
我希望按照以下示例实现OWIN: 然而,由于这种工作方式对我来说是新的,尤其是使用我自己创建的数据库,我希望得到一些指导。 我可以毫无问题地提交我的注册申请 这篇文章把我带到AccountController:C# 使用现有数据库名称验证实现OWIN?,c#,asp.net,owin,C#,Asp.net,Owin,我希望按照以下示例实现OWIN: 然而,由于这种工作方式对我来说是新的,尤其是使用我自己创建的数据库,我希望得到一些指导。 我可以毫无问题地提交我的注册申请 这篇文章把我带到AccountController: [AllowAnonymous] [Route("Register")] public async Task<IHttpActionResult> Register(RegisterBindingModel model) {
[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;
}
}
即使我在任何地方都不用名字?!这个名字来自哪里
所以我假设我做错了什么,但是如果没有一个关于如何在现有数据库中实现OWIN的清晰解释,就很难进行调试
在我的上下文/实体和用户表下方,我希望使用该表存储我的用户数据
背景:
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; }
}
编辑二:
我在教程代码中也有这个问题!这只是.NET中的一个奇怪的bug
编辑三
我试图做一个覆盖,正如你在上面的部分类用户中看到的那样。但我仍然有同样的错误
问题的原因是,在调用UserManager.CreateAsync之前,我没有向新用户添加用户名。如果我添加用户名,我会遇到与此完全相同的问题:
这个问题似乎指向这样一个事实:ASP.NET Identity在查询中使用了
UserName
属性,但实体框架认为该属性没有映射到实体模型(EDML)中的数据库列。我认为您的代码没有太多问题
不,它实际上通过了。我相信是经理说的,但是 每当我试图调试该代码时,调试器都会声明它已跳转 超过它(很可能是因为它是一个外部库 来自微软)
如果您使用try/catch来结束呼叫,您将能够看到错误消息我对您在此处共享的代码有一些问题,但与您提到的不完全相同。我已经在git上分享了这个示例,供您参考。你自己试试看,如果你发现任何问题,请告诉我 Git URL- 看,代码仍然与您的相同: 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();
我终于让它工作了 最后,我不得不添加并调整部分类用户(这是我的SQL数据库中的一个表),以便用户名和密码覆盖IDentityUser的字段(不像我在问题中所做的那样): 然后,在创建用户时,我只需传递密码和用户名:
var user = new users() {
Email = email,
UserName = email,
PasswordHash = password,
Password = password
};
您可以提交您的
DbContext
和ApplicationUser
代码吗?为什么要添加ID
,电子邮件
,密码
?通过从IdentityUser
继承,您的用户对象已具有。另外,您何时以及在哪一行收到错误?问题是因为在调用UserManager.CreateAsync之前,我没有向新用户添加用户名。如果我添加用户名,我会遇到与此完全相同的问题:“名称不能为null或空。”来自If(!ModelState.IsValid)
?不,它实际上传递了该问题。它来自于我相信经理,但每当我尝试调试代码时,调试器都会声明它跳过了它(很可能是因为它是Microsoft的外部库)。但是用户名和电子邮件都是我从IdentityDbContext使用的字段,IdentityDbContext有这两个字段,因此它们应该存在,否?字段存在于实体类型(例如用户
)中,而不是上下文类型(例如IdentityContext
)。是的,很抱歉,应该是“IdentityUser”。我正在使用来自IdentityUser的电子邮件和用户名。您需要明确地映射它们;实体框架会忽略从基类继承的映射。如何将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; }
}
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; }
}
"The specified type member 'UserName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."
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();
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; }
}
var user = new users() {
Email = email,
UserName = email,
PasswordHash = password,
Password = password
};