WebApi 2.0项目在哪里存储新用户(当使用个人用户身份验证创建时)



我创建了一个由MVC 5项目和WebAPI 2.0项目组成的解决方案,MVC项目设置为使用No authentication设置,WebAPI项目设置为采用individual users authentication设置。我还在MVC项目中添加了WebAPI项目的引用,并将解决方案配置为在启动时使用MVC项目-导航栏中的按钮会将我带到MVC控制器返回给我的视图,但当访问/api/values时,我会返回XML结果,所以我知道我的配置是有效的。我的目标是使用我的MVC项目只返回.cshtml视图,然后使用JQuery-ajax调用WebAPI获取数据,并将返回的数据与Knockout.js绑定。

话虽如此,我想使用新的IdentityAPI提供的所有安全功能,但使用IUA(个人用户身份验证)创建WebAPI项目和使用IUA创建MVC项目有很大不同。当我创建WebAPI项目时,我没有从IdentityUser派生的ApplicationUser类,我的API控制器也没有使用引用IdentityDB上下文的构造函数,这与MVC项目不同,在MVC项目中,用户的创建方式非常明显。以下分别是控制器代码的差异:

public class AccountController : ApiController
{
private const string LocalLoginProvider = "Local";
public AccountController()
: this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}
public AccountController(UserManager<IdentityUser> userManager,
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
UserManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
}...

MVC控制器:

public class AccountController : Controller
{
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new IdentityDb())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
public UserManager<ApplicationUser> UserManager { get; private set; }
}...

为什么ApiController中没有DbContext?执行Register方法时,UserManager在哪里存储新用户(?):

public async Task<IHttpActionResult> Register(RegisterBindingModel model)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
User user = new User
{
UserName = model.UserName
};
IdentityResult result = await UserManager.CreateAsync(user, model.Password);
IHttpActionResult errorResult = GetErrorResult(result);
if (errorResult != null)
{
return errorResult;
}
return Ok();
}

最终,我想让我的用户实体驻留在我的WebApi项目中(包含DB访问逻辑),或者更好地让类库处理所有数据库访问。我如何获得或创建一个DbContext实例,该实例将与从我的ApiController创建的用户一起使用?该上下文是否可以共享以容纳与该用户相关的其他实体?我意识到这个问题非常广泛,没有一个正确的方法来设计一个多层应用程序,但我觉得用户应该是一个"核心"DB实体,与所有其他人平等,由与其他人相同的层处理,所以我决定尝试使用IdentityAPI提供的样板代码,但同时希望具有一定的灵活性,并将用户视为核心实体。

您可以在WebAPI应用程序中使用MVC模板中的相同代码。在您的情况下,由于WebAPI模板使用的是Identity Framework中的IdentityUser和IdentityDbContext,因此应用程序将使用默认值,并使用EF将用户信息存储在数据库中。默认情况下使用的连接字符串名称为"DefaultConnection",因此您可以添加连接字符串名称并指定要使用的确切值。

相关内容

最新更新