Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net身份:UseAuthBearTokens和UseCookieAuthentication之间的区别?_C#_Asp.net_Asp.net Mvc_Asp.net Identity - Fatal编程技术网

C# ASP.Net身份:UseAuthBearTokens和UseCookieAuthentication之间的区别?

C# ASP.Net身份:UseAuthBearTokens和UseCookieAuthentication之间的区别?,c#,asp.net,asp.net-mvc,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Identity,ASP.NET团队提供了新的示例,展示了如何使用标识包。它们包含在以下nuget包中:Microsoft Asp.Net标识示例 这些示例非常有用,但是在最初发布的模板中所做的事情发生了大量变化 我的具体问题:在原始SPA模板中,有以下代码: OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString("/Token"),

ASP.NET团队提供了新的示例,展示了如何使用标识包。它们包含在以下nuget包中:Microsoft Asp.Net标识示例

这些示例非常有用,但是在最初发布的模板中所做的事情发生了大量变化

我的具体问题:在原始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.UseCookieAuthentication(新的CookieAuthenticationOptions
{
AuthenticationType=DefaultAuthenticationTypes.ApplicationOkie,
LoginPath=新路径字符串(“/Account/Login”),
Provider=新CookieAuthenticationProvider
{
//允许应用程序在用户登录时验证安全戳。
//这是一种安全功能,在您更改密码或向帐户添加外部登录时使用。
OnValidateIdentity=SecurityStampValidator.OnValidateIdentity(validateInterval:TimeSpan.FromMinutes(30),regenerateIdentity:(manager,user)=>user.GenerateUserIdentityAsync(manager))
}
});
有人能帮我理解app.useAuthBearTokens和app.UseCookieAuthentication之间的区别吗(以及为什么要进行此更改)?它们似乎都允许应用程序以相同的方式运行,我可以对此更改进行一些说明

谢谢


-Ben

OAuth用于API安全,在API中您不会使用cookie,这本质上是无状态的。然而,在一个普通的MVC或表单网站上,您将使用一个普通的会话cookie。除非您正在创建一个API,否则我不会担心OAuth,只需要使用传统的基于cookie的auth

如果您想创建一个API,那么您需要,我想说的是,您必须使用OAuth进行验证。然后,您将发送一个令牌和您的请求、post、put、delete。处理程序对该令牌进行解码,以显示权限、用户ID等

我认为最好扩展它并解释问题,以及OAuth解决它的原因

通常,api将位于UI的单独域中,例如应用程序、网站等。如果您确实设法从api(例如facebook.com)获得cookie,则您只能在facebook上使用此cookie。但是你的网站应该是www.myblog.com。Ajax中有一些设置允许通过Ajax请求传递cookie,但是域必须是相同的,这还相当粗略

因此Oauth诞生了,本质上创建了一个可以最好地描述为基于字符串的cookie,它可以存储在您喜欢的任何位置,只要它与您的请求一起在请求头中传递回来


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

感谢您的回答,但我有一个问题,如果我们使用Cordova PhoneGap(混合应用程序),那么我可以使用CookieAuthenticationProvider吗?oauth是基于令牌的,而不是基于cookie的,对于PhoneGap,您可以利用本地存储,或者将令牌存储在cookie中,然后使用javascript读取cookie并提取令牌以发送到头中。这里的问题是ajax请求从未真正发送cookie,我尝试过,无论您使用什么标题,您都无法让它工作,即使您让api发出cookie,ajax也不会发送它,只会发送来自同一域的cookie。@thangchung我已经更新了答案,并提供了一些详细信息,这将有助于你更好地理解这些东西是如何工作的,这是有道理的。我真的很感谢你的回答。干杯