【问题标题】:ASP.Net identity: Difference between UseOAuthBearerTokens and UseCookieAuthentication?ASP.Net 身份:UseOAuthBearerTokens 和 UseCookieAuthentication 之间的区别?
【发布时间】:2015-11-07 01:00:21
【问题描述】:

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 之间的区别(以及为什么要进行此更改)?它们似乎都允许应用程序以相同的方式运行,我可以对此更改进行一些说明。

谢谢...

-本

【问题讨论】:

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


    【解决方案1】:

    OAuth 用于 API 安全,在 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,对于桌面应用程序,您可以使用临时存储、本地数据库等,而手机应用程序将有类似的东西。

    【讨论】:

    • 感谢您的回答,但我有一个问题,如果我们使用 Cordova PhoneGap(混合应用程序),那么我可以使用 CookieAuthenticationProvider 吗?
    • oauth 是基于令牌的,而不是基于 cookie 的,对于 phonegap,您可以利用 localstorage,或将令牌存储在 cookie 中,然后使用 javascript 读取您的 cookie 并提取令牌以发送标题。这里的问题是ajax请求从来没有真正发送cookie,我试过了,无论你弄乱什么标题,你都不会让它工作,即使你让api发出cookie,ajax也不会发送它,并且只会发送来自同一个域的 cookie。
    • @thangchung 我已经更新了更多细节的答案,希望能帮助您更好地了解这些事情是如何工作的。
    • 这是有道理的。我真的很感谢你的回答。干杯。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2013-06-23
    • 2021-06-23
    • 2011-09-16
    相关资源
    最近更新 更多