我一直在使用VS2013 RTW MVC模板中的新ASP.NET身份产品(用于“个人用户帐户”),并且效果很好:我能够在定制数据的方式时整合Facebook登录序列
一切都很好,但我注意到如果我创建一个新的SPA应用程序(而不是MVC),身份验证故事似乎非常不同。举个例子:
来自SPA模板:
public AccountController()
: this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
{
}
public AccountController(UserManager<IdentityUser> userManager,
ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
{
UserManager = userManager;
AccessTokenFormat = accessTokenFormat;
}
来自MVC模板:
public AccountController()
: this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
{
}
public AccountController(UserManager<ApplicationUser> userManager)
{
UserManager = userManager;
}
这只是Account控制器构造函数的区别。还有许多其他差异。使用MVC版本,我能够轻松地从ApplicationDBContext派生我自己的上下文类,并使用它来存储我自己的表和身份验证表。我无法弄清楚如何在SPA模板中自定义数据存储。
此外,SPA模板包含并使用此类: 公共类ApplicationOAuthProvider:OAuthAuthorizationServerProvider
MVC模板未定义(或使用)此类。
我不明白为什么MVC模板和SPA模板之间需要有任何差异。
在这两个模板中,有人可以给我一些指导,说明为什么认证处理方式如此不同?从头开始一个项目,两者之间是否有一条首选路径? (看起来MVC模板中的代码是最好的,特别是在通过定义自定义EF Context类来定制数据存储方式方面。)
...谢谢
-Ben
答案 0 :(得分:4)
将MVC和SPA项目模板作为Controller vs ApiController
实施示例。
以及CookieAuthentication和oAuthAuthentication。
现在在真正的应用程序中,我们需要兼顾两者。说明这一点,你也可以在SPA中使用IdentityModel.cs(ApplicationDBContext)和它的MVC项目的自定义副本。
在oAuth实施中,令牌以GrantResourceOwnerCredentials
ApplicationOAuthProvider
方式发布。默认情况下,用户验证使用相同的Identity框架数据库。此外,oAuth在ApiController中提供身份验证检查。在示例实现中,提供了oAuth的ResourceOwner流程,用于验证用户的用户名和密码。
在我看来,模板是起点示例。
答案 1 :(得分:1)
当我第一次看到有关为用户更改模型的所有帖子时,我确实注意到了同样的事情,我在SPA模板中找不到该模型。当然,@ jd4u指出的差异是一个基于Controller而另一个基于ApiController。
所以,我决定看看如何使SPA解决方案使用与MVC模板相同的Identity Model扩展。我创建了一个post,它经历了我经历的过程。底部有一个链接,可以从GitHub下载代码。