Visual studio 2013 VS2013(RTW):SPA模板与MVC5模板的身份验证差异?

Visual studio 2013 VS2013(RTW):SPA模板与MVC5模板的身份验证差异?,visual-studio-2013,asp.net-mvc-5,owin,asp.net-identity,katana,Visual Studio 2013,Asp.net Mvc 5,Owin,Asp.net Identity,Katana,我一直在VS2013 RTW MVC模板(针对“独立用户帐户”)中使用新的ASP.NET标识产品,效果非常好:我能够在自定义数据序列化方式的同时集成Facebook登录 一切都很好,但我注意到,如果我创建一个新的SPA应用程序(而不是MVC),身份验证的故事似乎非常不同。例如: 从SPA模板: public AccountController() : this(Startup.UserManagerFactory(), Startup.OAuthOptions.Acces

我一直在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;
    }
    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
    {
    }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }
publiccountcontroller()
:这(Startup.UserManagerFactory()、Startup.OAuthOptions.AccessTokenFormat)
{
}
公共帐户控制器(用户管理器用户管理器,
ISecureDataFormat访问令牌格式)
{
UserManager=UserManager;
AccessTokenFormat=AccessTokenFormat;
}
从MVC模板:

    public AccountController()
        : this(Startup.UserManagerFactory(), Startup.OAuthOptions.AccessTokenFormat)
    {
    }

    public AccountController(UserManager<IdentityUser> userManager,
        ISecureDataFormat<AuthenticationTicket> accessTokenFormat)
    {
        UserManager = userManager;
        AccessTokenFormat = accessTokenFormat;
    }
    public AccountController()
        : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
    {
    }

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        UserManager = userManager;
    }
publiccountcontroller()
:此(新的UserManager(新的UserStore(新的ApplicationDbContext()))
{
}
公共帐户控制器(用户管理器用户管理器)
{
UserManager=UserManager;
}
这就是Account controller的构造函数之间的区别。还有很多其他的不同之处。有了MVC版本,我可以轻松地从ApplicationDBContext派生出自己的上下文类,并使用它将自己的表与身份验证表一起存储。我不知道如何在SPA模板中自定义数据存储

此外,SPA模板还包括并使用此类: 公共类ApplicationAuthProvider:OAuthAuthorizationServerProvider

MVC模板没有定义(或使用)这个类

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

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

谢谢


-Ben

将MVC和SPA项目模板作为控制器与ApiController的实现示例。 以及CookieAuthentication和OAuthaAuthentication

  • MVC在第一个请求以及所有后续请求(具有请求定义的操作方法)时使用控制器
  • SPA在向SPA发出第一个请求时使用控制器,所有其他交互都由ApicController处理
  • MVC使用cookie身份验证
  • SPA使用oAuth身份验证
现在在真正的应用程序中,我们需要将两者结合起来。说明这一点,您可以在SPA中使用IdentityModel.cs(ApplicationDBContext)及其MVC项目的定制副本

在oAuth实现中,令牌是在
applicationAuthProvider
GrantResourceOwnerCredentials
方法中发出的。默认情况下,用户验证使用相同的Identity framework数据库。此外,oAuth在ApicController中提供身份验证检查。在示例实现中,提供了oAuth的ResourceOwner流,其中验证了用户的用户名和密码


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

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


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

这很奇怪。据我所知,
OWin.Security
旨在统一ASP.Net上的身份验证。至少是后端。在前端,它们是不同的,这是有道理的。MVC5使用
AccountController
/
AccountView
处理身份验证。然而,SPA的全部要点是,您只有一个页面(单个控制器/视图)。因此,我想auth组件需要注入到您的SPA控制器中,而不是在单独的控制器中实现auth…就我的两分钱。是否有一个示例可以说明如何将MVC和SPA应用程序与身份验证结合在一起?我正试图让一个传统的mvc应用程序将其中的一部分用作SPA,但无法同时为这两个应用程序进行身份验证,你能帮我指出一个方向吗?没有这样的例子。虽然SPA模板是一种简单的方式来处理这两个场景的大量定制。omeszar,你能将你博客文章的相关部分添加到这个答案中吗?如果你的博客在某个时候无法访问,你的答案将毫无用处。