我创建了一个包含MVC 5项目和WebAPI 2.0项目的解决方案,MVC项目设置为使用No authentication
设置,WebAPI项目设置为使用individual users authentication
设置。我还在我的MVC项目中添加了我的WebAPI项目的引用,并将解决方案配置为使用MVC项目,因为它的启动 - 导航栏中的按钮将我带到MVC控制器返回给我的视图,但访问时{ {1}}我得到了XML结果,所以我知道我的配置是有效的。我的目标是使用我的MVC项目只返回/api/values
个视图,这些视图将使用JQuery ajax调用WebAPI来获取数据,并将返回的数据与.cshtml
绑定。
话虽这么说,我想使用新Knockout.js
API提供的所有安全功能,但在使用IUA(单个用户身份验证)创建WebAPI项目和创建MVC项目方面存在很大差异。与IUA。当我创建WebAPI项目时,我没有从Identity
派生ApplicationUser
类,我的API控制器也没有使用引用IdentityUser
上下文的构造函数,这与MVC项目非常明显相似如何创建用户。
以下是控制器代码的不同之处:
IdentityDB
..和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;
}
}...
为什么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; }
}...
中没有DbContext? ApiController
在执行UserManager
方法(?)时存储新用户的位置:
Register
最终,我想让我的用户实体驻留在我的WebApi项目中(包含数据库访问逻辑),或者更好地让我们的类库处理所有数据库访问。如何获取或创建与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();
}
创建的用户一起使用的DbContext
实例,并且可以共享该上下文以容纳与用户相关的其他实体?
我意识到这个问题非常广泛,没有一种正确的方法可以设计一个多层应用程序,但我觉得用户应该是一个“核心”数据库实体,与所有其他实体相同,并由同一层处理其他人,所以我决定尝试使用ApiController
API提供的样板代码,但同时希望有一些灵活性并将用户视为核心实体。
答案 0 :(得分:3)
您可以在WebAPI应用程序中使用与MVC模板相同的代码。在您的情况下,由于WebAPI模板使用Identity Framework中的IdentityUser和IdentityDbContext,因此应用程序将使用默认值并使用EF将用户信息存储在数据库中。默认使用的连接字符串名称为&#34; DefaultConnection&#34;所以你可以添加一个连接字符串名称并指定要使用的确切值。