And*_*ors 4 asp.net asp.net-identity
我一直试图了解重置密码和帐户确认在ASP.NET身份中的工作原理.我只想知道令牌是否存储,如果存储,在哪里?
我使用密码重置功能时收到的链接看起来像这样
http://localhost:1470/Account/ResetPassword?userId=a8b1389c-df93-4dfc-b463-541507c1a4bc&code=yhUegXIM9SZBpPVbBtv22kg7NO7F96B8MJi9MryAadUY5XYjz8srVkS5UL8Lx%2BLPYTU6a6jhqOrzMUkkMyPbEHPY3Ul6%2B%2F0s0qQvtM%2FLLII3s29FgkcK0OnjX46Bmj9JlFCUx53rOH%2FXMacwnKDzoJ1rbrUyypZiJXloIE50Q6iPuMTUHbX9O%2B3JMZtCVXjhhsHLkTOn9IVoN6uVAOMWNQ%3D%3D
Run Code Online (Sandbox Code Playgroud)
我的猜测是令牌存储在链接本身,因为我无法在其他任何地方找到它的任何痕迹.也许有人确切知道?
DSR*_*DSR 10
正如我在评论中提到的那样
"使用SecurityStamp生成令牌并对SecurityStamp进行验证,而不是存储在数据库或本地文件存储中的任何位置.如果更新SecurityStamp,则之前的令牌不再有效."
@DSR 是正确的,但我也想为此添加一些信息。
如果您已经设置了一个 Web 项目,Individual User Accounts请转到:
App_Start -> IdentityConfig.cs
Run Code Online (Sandbox Code Playgroud)
在那里你会看到这样的代码:
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
Run Code Online (Sandbox Code Playgroud)
的描述DataProtectorTokenProvider<TUser,?TKey>给出了信息:
表示使用 IDataProtector 根据安全戳生成加密令牌的令牌提供程序。
https://docs.microsoft.com/en-us/previous-versions/aspnet/dn613280(v%3dvs.108)
然而,我们可以尝试更深入地挖掘它的真正工作原理。如果Application Pool Identities在单个服务器上使用不同的令牌来创建和验证令牌,则令牌验证将失败。这表明实际的保护机制如下所示:
System.Security.Cryptography.ProtectedData.Protect(userData, entropy, DataProtectionScope.CurrentUser);
Run Code Online (Sandbox Code Playgroud)
鉴于如果所有站点也使用相同的Application Pool Identity点,它也可以工作。也可以DataProtectionProvider与protectionDescriptor "LOCAL=user". 它应该与不同的Application Pool Identitiesif一起工作LOCAL=machine。
new DataProtectionProvider("LOCAL=user")
Run Code Online (Sandbox Code Playgroud)
dataProtectionProvider是 类型IDataProtectionProvider。
它像这样注入到 Startup.Auth.cs 中:
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
Run Code Online (Sandbox Code Playgroud)
CreatePerOwinContext位于程序集Microsoft.AspNet.Identity.Owin-> AppBuilderExtensions.cs。两个ASP.NET Identity和ASP.NET Core Identity是开放源,并且可以在GitHub的观看。
public static IAppBuilder CreatePerOwinContext<T>(this IAppBuilder app,
Func<IdentityFactoryOptions<T>, IOwinContext, T> createCallback,
Action<IdentityFactoryOptions<T>, T> disposeCallback) where T : class, IDisposable
{
if (app == null)
{
throw new ArgumentNullException("app");
}
if (createCallback == null)
{
throw new ArgumentNullException("createCallback");
}
if (disposeCallback == null)
{
throw new ArgumentNullException("disposeCallback");
}
app.Use(typeof (IdentityFactoryMiddleware<T, IdentityFactoryOptions<T>>),
new IdentityFactoryOptions<T>
{
DataProtectionProvider = app.GetDataProtectionProvider(),
Provider = new IdentityFactoryProvider<T>
{
OnCreate = createCallback,
OnDispose = disposeCallback
}
});
return app;
}
Run Code Online (Sandbox Code Playgroud)
app.GetDataProtectionProvider()又位于Microsoft.Owin.Security同样是开源的程序集中。
public static IDataProtectionProvider GetDataProtectionProvider(this IAppBuilder app)
{
if (app == null)
{
throw new ArgumentNullException("app");
}
object value;
if (app.Properties.TryGetValue("security.DataProtectionProvider", out value))
{
var del = value as DataProtectionProviderDelegate;
if (del != null)
{
return new CallDataProtectionProvider(del);
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我们还可以看到它CreateDataProtector有一个回退到实现DpapiDataProtectionProvider。
private static IDataProtectionProvider FallbackDataProtectionProvider(IAppBuilder app)
{
return new DpapiDataProtectionProvider(GetAppName(app));
}
Run Code Online (Sandbox Code Playgroud)
在阅读DpapiDataProtectionProvider(DPAPI 代表数据保护应用程序编程接口)时,描述说:
用于提供派生自数据保护 API 的数据保护服务。当您的应用程序不是由 ASP.NET 托管并且所有进程都以相同的域标识运行时,它是数据保护的最佳选择。
Create 方法的用途描述为:
用于确保受保护数据的附加熵只能出于正确目的而不受保护。
保护器类本身看起来像这样:
using System.Security.Cryptography;
namespace Microsoft.Owin.Security.DataProtection
{
internal class DpapiDataProtector : IDataProtector
{
private readonly System.Security.Cryptography.DpapiDataProtector _protector;
public DpapiDataProtector(string appName, string[] purposes)
{
_protector = new System.Security.Cryptography.DpapiDataProtector(appName, "Microsoft.Owin.Security.IDataProtector", purposes)
{
Scope = DataProtectionScope.CurrentUser
};
}
public byte[] Protect(byte[] userData)
{
return _protector.Protect(userData);
}
public byte[] Unprotect(byte[] protectedData)
{
return _protector.Unprotect(protectedData);
}
}
}
Run Code Online (Sandbox Code Playgroud)
https://docs.microsoft.com/en-us/previous-versions/aspnet/dn253784(v%3dvs.113)
| 归档时间: |
|
| 查看次数: |
2235 次 |
| 最近记录: |