ASP.Net身份验证:UseOAuthBearerTokens和UseCookieAuthentication之间的区别是什么?

10

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个回答

18

OAuth被用于API安全,而在API中你不会使用cookie,因为它本质上是无状态的。但是在普通的MVC或表单网站上,你会使用普通的会话cookie。除非你正在创建一个API,否则不需要担心OAuth,可以选择传统的基于cookie的身份验证。

如果你想创建一个API,那么你必须使用OAuth进行验证。然后你会在请求(post、put、delete)中发送一个令牌。这个令牌在后端被解码处理程序以显示权限、用户ID等信息。

最好扩展一下并解释问题,以及OAuth是如何解决这些问题的。

通常API会位于与UI分离的不同域名下,可能是APP、网站等。如果你从API(例如Facebook.com)获得了一个cookie,那么你只能在Facebook上使用这个cookie。但是你的网站是www.myblog.com。尽管Ajax中有设置可以启用cookie传递,但域名必须相同,而且这还是不可靠的。

因此,OAuth应运而生,本质上创建了一个基于字符串的cookie,只要它在请求头中随请求一起传递,你可以将其存储在任意地方。

在浏览器应用程序中,你可以使用JavaScript创建cookie,并将令牌保存在其中。这样可以利用持久存储。但是最好使用可用的本地存储(如LocalStorage API),对于桌面应用程序,你可以使用临时存储、本地数据库等,手机应用程序也会有类似的功能。


谢谢您的回答,但我有一个问题,如果我们使用Cordova PhoneGap(混合应用程序),那么我能使用CookieAuthenticationProvider吗? - thangchung
OAuth是基于令牌而非基于Cookie的。对于PhoneGap,您可以利用本地存储或将令牌存储在Cookie中,然后使用JavaScript读取Cookie并提取令牌以便在标头中发送。问题在于Ajax请求从未真正发送Cookie。我尝试过,无论您如何更改标头,都无法使其工作。即使您让API发出Cookie,Ajax也不会发送它,并且只会发送来自相同域的Cookie。 - davethecoder
@thangchung 我已经更新了答案,并加入了更多细节,希望这些能够帮助你更好地理解这些事情是如何工作的。 - davethecoder
这很有道理。我非常感谢你的回答。干杯。 - thangchung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接