2

我一直在使用 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 模板包含并使用此类: public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider

MVC 模板不定义(或使用)此类。

我不明白为什么 MVC 模板和 SPA 模板之间需要有任何区别。

谁能给我一些指导,说明为什么这两个模板中的身份验证处理方式如此不同?从头开始一个项目,两者之间是否有首选路径?(看起来 MVC 模板中的代码是最好的,尤其是在通过定义自定义 EF 上下文类来自定义数据存储方式方面。)

谢谢...

-本

4

2 回答 2

4

以 MVC 和 SPA 项目模板作为Controller vs ApiController实现示例。以及 CookieAuthentication 和 oAuthAuthentication。

  • MVC 在第一个请求以及所有后续请求(具有请求定义的操作方法)中使用 Controller。
  • SPA 在第一次请求 SPA 时使用 Controller,所有其他交互都由 ApiController 处理。
  • MVC 使用 cookie 身份验证。
  • SPA 使用 oAuth 身份验证。

现在在真正的应用程序中,我们需要将两者结合起来。说明这一点,您也可以在您的 SPA 中使用 IdentityModel.cs (ApplicationDBContext) 和 MVC 项目的自定义副本。

在 oAuth 实现中,令牌GrantResourceOwnerCredentialsApplicationOAuthProvider. 用户验证默认使用 Identity 框架的同一个数据库。此外,oAuth 在 ApiController 中提供身份验证检查。在示例实现中,提供了 oAuth 的 ResourceOwner 流程​​,其中验证了用户的用户名和密码。

在我看来,模板是起点示例。

于 2013-10-20T07:31:06.743 回答
1

当我第一次查看有关为用户更改模型的所有帖子并且在 SPA 模板中找不到模型时,我确实注意到了同样的事情。当然,正如@jd4u 所指出的不同之处在于,一个基于Controller,另一个基于ApiController。

因此,我决定看看如何让 SPA 解决方案使用与 MVC 模板相同的身份模型扩展。我创建了一个帖子,介绍了我所经历的过程。底部有一个链接可以从 GitHub 下载代码。

于 2013-10-23T14:16:17.730 回答