ASP.Net身份:UseOAuthBearerTokens和UseCookieAuthentication之间的区别?

时间:2014-03-01 22:38:28

标签: c# asp.net asp.net-mvc asp.net-identity

ASP.NET团队已发布了展示如何使用标识包的新示例。它们包含在以下nuget包中:Microsoft Asp.Net Identity Samples

这些示例非常有用,但是在发布的模板中最初完成的工作方式发生了很多变化。

我的具体问题:在原始SPA模板中,有以下代码:

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
...
        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

但是在nuget包中的新样本中,代码已经消失了,取而代之的是这段代码:

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                // Enables the application to validate the security stamp when the user logs in.
                // This is a security feature which is used when you change a password or add an external login to your account.  
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
            }
        });

任何人都可以帮我理解app.UseOAuthBearerTokens和app.UseCookieAuthentication之间的区别(以及为何进行此更改)?它们似乎都允许应用程序以相同的方式运行,我可以对此更改使用一些澄清。

...谢谢

-Ben

1 个答案:

答案 0 :(得分:15)

OAuth用于API安全,IN API不使用Cookie,这基本上是无状态的。但是,对于普通的MVC或表单网站,您可以使用普通的会话cookie。除非您正在创建API,否则我不会担心OAuth,只需使用传统的基于cookie的身份验证。

如果你想创建一个API,那么你需要,我会说必须要OAuth进行验证。然后,您将发送包含您的请求,发布,放置,删除的令牌。该令牌由处理程序解码后端以显示权限,用户ID等

认为最好扩展这个并解释问题,以及为什么OAuth会解决它。

通常api将位于UI的单独域中,即APP,网站等。如果您确实设法从API(例如facebook.com)获得cookie,您将只能使用Facebook上的这个cookie。但您的网站将是www.myblog.com。 Ajax中有一些设置可以使用ajax请求传递cookie,但是域必须是相同的,这仍然是相当粗略的。

所以Oauth诞生了,基本上创建了一个最好被描述为基于字符串的cookie,可以随意存储,只要它在请求标题中与您的请求一起传回。

您可以在浏览器应用程序中使用javascript创建cookie,并将令牌保存在此cookie中。这将允许您利用持久存储。但是,使用可用的本地存储可能更好。因此,对于基于浏览器的应用程序,这将是LocalStorage API,对于桌面应用程序,您可以使用临时存储,本地数据库等,而手机应用程序将具有类似的功能。