【问题标题】:VS2013 (RTW): Authentication differences in SPA template vs MVC5 template?VS2013 (RTW):SPA 模板与 MVC5 模板的身份验证差异?
【发布时间】:2013-10-28 10:19:44
【问题描述】:

我一直在使用 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 类来自定义数据存储方式方面。)

谢谢...

-本

【问题讨论】:

  • 这很奇怪。据我了解,OWin.Security 旨在统一 ASP.Net 上的 Auth。至少后端。在前端,它们不同是有道理的。 MVC5 使用 AccountController/AccountView 处理 Auth。但是,SPA 的全部要点是您只有一个页面(单个控制器/视图)。所以我猜 auth 组件需要注入到您的 SPA 控制器中,而不是在单独的控制器中实现 auth ......只是我的两分钱。

标签: visual-studio-2013 asp.net-mvc-5 owin asp.net-identity katana


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 是否有示例可以显示如何将 MVC 和 SPA 应用程序与身份验证混合在一起?我正在尝试让一个传统的 mvc 应用程序将它的一部分用作 SPA,但无法同时为两者进行身份验证工作,请你帮我指个方向吗?
  • 没有这样的例子。尽管 SPA 模板是处理这两种场景的大量自定义的简单方法。
【解决方案2】:

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

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

【讨论】:

  • omeszar,您能否将您博客文章的相关部分添加到此答案中?如果您的博客一段时间无法访问,您的回答将毫无用处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 2014-11-16
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多