Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
Entity framework 如何在外部管理(添加)ASP.NET Core 3.1应用程序的用户_Entity Framework_Authentication_Password Encryption_Password Hash_Asp.net Core 3.1 - Fatal编程技术网

Entity framework 如何在外部管理(添加)ASP.NET Core 3.1应用程序的用户

Entity framework 如何在外部管理(添加)ASP.NET Core 3.1应用程序的用户,entity-framework,authentication,password-encryption,password-hash,asp.net-core-3.1,Entity Framework,Authentication,Password Encryption,Password Hash,Asp.net Core 3.1,很抱歉,这里没有提供代码,因为我完全没有这个想法 上下文:我开发了两个应用程序,都是ASP.NETCore3.1,让我们称它们为A和B A是一个面向互联网的网站。只有具有有效用户帐户的用户才能访问。不可能在应用程序A中注册一个用户 B是一个内部(内部网)网站。(使用Active Directory进行身份验证。)从应用程序B我希望能够为应用程序A创建用户 应用程序A与Active Directory无关,我使用ASP.NET核心的正常inbuild用户管理 是否可以使用实体框架从应用程序B向应用

很抱歉,这里没有提供代码,因为我完全没有这个想法

上下文:我开发了两个应用程序,都是ASP.NETCore3.1,让我们称它们为A和B

A是一个面向互联网的网站。只有具有有效用户帐户的用户才能访问。不可能在应用程序A中注册一个用户

B是一个内部(内部网)网站。(使用Active Directory进行身份验证。)从应用程序B我希望能够为应用程序A创建用户

应用程序A与Active Directory无关,我使用ASP.NET核心的正常inbuild用户管理

是否可以使用实体框架从应用程序B向应用程序A输入用户?还是有更好的方法?如果它与实体框架一起工作,我将如何获得应用程序A用于加密密码的Salt值


澄清:我对应用程序B的用户身份验证或注册没有任何疑问,这一切都是有效的。

因为在您提到的评论中,您更关注盐的存储方式,我假设您已经设置了EF指向
应用程序A
成员数据库,并将重点放在这个哈希位上。我将假设您使用管理您的密码

如果您查看一下密码是如何使用的,您会注意到这两个操作最终都依赖于密码来完成这项工作。框架将依赖性注入到UserManager中,并查看实现:

私有静态字节[]HashPasswordV3(
字符串密码,
随机数发电机rng,
键衍生prf prf,
int iterCount,
int saltSize,
整数(已请求)
{
字节[]numaray1=新字节[saltSize];
rng.GetBytes(numArray1);
字节[]numArray2=Microsoft.AspNetCore.Cryptography.keydrivation.keydrivation.Pbkdf2(密码,numArray1,prf,iterCount,numbytes请求);
字节[]缓冲区=新字节[13+numArray1.Length+numArray2.Length];
缓冲区[0]=(字节)1;
PasswordHasher.WriteNetworkByteOrder(缓冲区,1,(uint)prf);//哈希类型
PasswordHasher.WriteNetworkByteOrder(缓冲区,5,(uint)iterCount);//迭代次数
PasswordHasher.WriteNetworkByteOrder(缓冲区,9,(uint)saltSize);//salt大小(尽管在此实现中不可配置)
BlockCopy((数组)numArray1,0,(数组)Buffer,13,numArray1.Length);//这里是salt
BlockCopy((数组)numArray2,0,(数组)Buffer,13+saltSize,numArray2.Length);//这里是密码哈希
return buffer;//这将得到Base64编码的上游
}
salt似乎只是一个随机的16字节数组,它与
散列
散列函数
使用的迭代次数
一起存储,因此,一个应用程序创建的散列应该可以被另一个应用程序读取,而无需为您做任何额外的工作,只要它们相同


这里需要注意的另一件事是,由于
PasswordHasher
是,如果需要,您实际上可以用自己的实现替换它。希望能为您提供足够的上下文。

您可以使用以下方法轻松创建密码哈希

public string CreateHash(TUser user, string password)
{
    var hasher = new PasswordHasher<TUser>();

    return (hasher.HashPassword(user, password));
}
publicstringcreatehash(用户,字符串密码)
{
var hasher=new PasswordHasher();
返回(hasher.HashPassword(user,password));
}

用户对象甚至不能是您要更改密码的对象。

因此,您似乎希望将
应用程序B中的EF指向
应用程序A的ASP.NET成员身份数据库?我相信您的项目中可以有多个
dbcontext
和连接字符串。您的假设是正确的。我的意思是,这已经起作用了,但是我只是不知道我应该如何修改新注册用户的密码,以便应用程序a能够执行身份验证。谢谢你,帖木儿。悬赏就要暂停了,所以我把它给了你。然而,我还没有证实你的答案。不过,谢谢你的努力。我会尽快尝试你的建议。