很抱歉,这里没有提供代码,因为我完全不知道这个主意。
上下文:我开发了两个应用程序,都为ASP.NET Core 3.1,我们将它们称为A和B。
A是一个网站,可以访问互联网。只有具有有效用户帐户的用户才能访问。在应用程序A中不得注册一个用户。
B是内部(内部网)网站。 (使用Active Directory进行身份验证。)我希望能够从应用程序B创建应用程序A的用户。
应用程序A与Active Directory无关,我使用ASP.NET Core的常规内置用户管理。
是否可以通过使用实体框架将用户从应用程序B输入到应用程序A?还是有更好的方法?如果它与Entity Framework一起使用,我将如何获得应用程序A用来对密码加盐的Salt值?
为了澄清:我对应用程序B的用户身份验证或注册没有任何疑问,这一切正常。
由于在您提到的评论中,您只想知道盐的存储方式,所以我假设您已经建立了指向Application A
成员资格数据库的EF,并将重点放在此哈希位上。我假设您使用UserManager
来管理密码。
[如果您查看密码UserManager
和stored的状态,您会发现两个操作最终都依赖verified来完成工作。它是框架将依赖项注入到UserManager中,并查看实现:
PasswordHasher
似乎salt只是一个随机的16字节数组,与PasswordHasher
,private static byte[] HashPasswordV3(
string password,
RandomNumberGenerator rng,
KeyDerivationPrf prf,
int iterCount,
int saltSize,
int numBytesRequested)
{
byte[] numArray1 = new byte[saltSize];
rng.GetBytes(numArray1);
byte[] numArray2 = Microsoft.AspNetCore.Cryptography.KeyDerivation.KeyDerivation.Pbkdf2(password, numArray1, prf, iterCount, numBytesRequested);
byte[] buffer = new byte[13 + numArray1.Length + numArray2.Length];
buffer[0] = (byte) 1;
PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 1, (uint) prf); // hash type
PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 5, (uint) iterCount); // number of iterations
PasswordHasher<TUser>.WriteNetworkByteOrder(buffer, 9, (uint) saltSize); // salt size (although not configurable in this implementation)
Buffer.BlockCopy((Array) numArray1, 0, (Array) buffer, 13, numArray1.Length); // salt goes here
Buffer.BlockCopy((Array) numArray2, 0, (Array) buffer, 13 + saltSize, numArray2.Length); // password hash goes here
return buffer; // this gets Base64-encoded upstream
}
和hash
一起存储,因此,由一个应用程序创建的哈希应该可以被另一个应用程序读取,而无需您做任何额外的工作只要hashing function
和number of iterations used
相同。
这里要注意的另一件事,由于PasswordHasherCompatibilityMode
是PasswordHasherCompatibilityMode
,因此实际上您可以根据需要用自己的实现替换它。希望戳一下generating OS可以为您提供足够的上下文。