2016-12-12 13 views
4

私は.NET Core app + Identityを開発中です。私はユーザーのサインアップを実装したいと思います。 ユーザーはあなたのデータログイン/パスワード等を入力してください。次のステップで私は電子メールを確認する必要があります。私は新しいデータベースを作成する必要があるので、電子メールを確認する前にdbでユーザを作成したくありません。私はDBの一時テーブルにデータを保存したい。確認の後、私はそこからデータを取り出して登録を続け、その後、一時テーブルからレコードを削除します。一時的なパスワードをdbで保存するASP.NETコア

しかし、アイデンティティにはパスワードがクリアテキストのuserManager.Create(user, password)メソッドがあります。

ハッシュ/デハッシュパスワードアルゴリズムが必要ですか?はいの場合は、それは何ですか? 一時テーブルに安全なパスワードを保存する最良の方法は何ですか?

+0

デフォルトの実装では、デフォルトでパスワードがハッシュされ、クリアテキストで保存または送信されることはありません。 – Marco

答えて

0

だから、私は次のようでした:

1)利用者=ヌル(最初のパラメータ)のためのパスワードを生成します。

var hashPassword = _passwordHasher.HashPassword(null, command.Password); 

2)ユーザーが電子メールを確認すると、 sの値で

_userManager.CreateAsync(user, "123456"); 

3)アップデートPasswordHash列とユーザー:私はStartup.csクラスでパスワード検証設定を通過するデフォルトのパスワードで彼を作成しますtep 1:

user.PasswordHash = command.PasswordHash; 
_userManager.UpdateAsync(user); 
2

いいえいいえ - 私は自動的にUserManagerによってデータベースにハッシュされます。

私の意見では、一時的な記録を作成することは好ましくありません。ユーザーを作成し、電子メールを確認するまで、非アクティブとしてマークします。それが正しいアプローチです。

+0

私の場合、ユーザーがサインアップした後、新しいdbを作成し、その新しいユーザーを新しいdbに格納する必要があります。私は確認メールなしですべてのユーザーのためにdbを作成したくありません。 –

+0

その場合、特定の種類の「マスター」データベースの概念が良いアイデアになることがあります(特定のユーザー専用のデータベースの横にあります) –

+0

アイデンティティを「マスター」する必要がありますか? 「マスター」データベースから新しいデータベースへ –

0

必ずしもハッシュアルゴリズムを使用する必要があります。 IDはパスワードベースのキー導出関数2(PBKDF2) - wikiを使用します。ハッシュパスワードの例を示します。

public static string HashPass(string pwd) 
{ 
    byte[] salt; 
    byte[] bytes; 

    using (Rfc2898DeriveBytes rfc2898DeriveByte = new Rfc2898DeriveBytes(pwd, 16, 1000)) 
    { 
     salt = rfc2898DeriveByte.Salt; 
     bytes = rfc2898DeriveByte.GetBytes(32); 
    } 
    byte[] num = new byte[49]; 
    Buffer.BlockCopy(salt, 0, num, 1, 16); 
    Buffer.BlockCopy(bytes, 0, num, 17, 32); 
    return Convert.ToBase64String(num); 
} 

良いアイデアは、ユーザーアカウントに関するステータスを格納することができ、いくつかの状況でUserAccountのテーブルを使用することになります。

public class UserAccount 
{ 
    public int AccountId { get; set;} 

    public UserAccountStatus AccountStatus { get; set; } 

} 

public enum UserAccountStatus 
{ 
    Pending = 0, 
    UsingTempPassword = 1 
    Active = 2 
} 
+0

新しいユーザーのために、dbを作成してそこに保存する必要がありますが、すべてのユーザーに対してdbを実行する必要はありません。そして私が理解しているように、私はあなたのケースでパスワードをデハッシュできませんか? –

+0

ASP.NETコアでは、次のようなことが可能です: 'userManager.PasswordHasher = new MyPasswordHasher()' –

-1

私が思う最高のSHA1ハッシュアルゴリズムである、それは標準で128ビットです。私はそれを使って私のPHP論文をやったのを覚えています:)。それはすべての中で最も安全です。

使用フォーム認証( https://msdn.microsoft.com/en-us/library/t8yy6w3h.aspx ):

<configuration> 
<connectionStrings> 
    <add name="SqlServices" connectionString="Data Source=MySqlServer;Integrated Security=SSPI;Initial Catalog=aspnetdb;" /> 
</connectionStrings> 
<system.web> 
    <authentication mode="Forms"> 
    <forms loginUrl="login.aspx" /> 
    </authentication> 
    <authorization> 
    <deny users="?" /> 
    </authorization> 
    <membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="20"> 
    <providers>   
    <add name="SqlProvider" 
     type="System.Web.Security.SqlMembershipProvider" 
     connectionStringName="SqlServices" 
     enablePasswordRetrieval="false" 
     enablePasswordReset="true" 
     requiresQuestionAndAnswer="false" 
     passwordFormat="Hashed" 
     applicationName="/" /> 
    </providers> 
</membership> 
</configuration> 
</system.web> 

Uはちょ​​うどインスタンス名とログインページを変更します。 デフォルトのハッシュ・アルグ。 SHA1であり、.NET 4.0 FrameworkではHMACSHA256またはSHA256に変更されます。 Uはそれを上書きすることができます。

<membership 
    defaultProvider="provider name" 
    userIsOnlineTimeWindow="number of minutes" 
    hashAlgorithmType="SHA1"> 
    <providers>...</providers> 
</membership> 

あなたは.NET 4のために、あなたの.NETバージョンでサポートされている最大のSHAを指定することができますし、最新のSHA512ですが、デフォルト値はOKでなければなりません。

https://msdn.microsoft.com/en-us/library/693aff9y.aspx:あなたは(uは世界的にそれを使用したくない場合には、web.configファイルでも可能性のmachine.configに設定するか、されるだけの.dllである)ここで読むことができますあなたを追加するには

ログオン時にユーザーを検証するには、Membership.Validateを使用します。

2013年に来た新しいMVCを使用する場合は、UserManagerが電子メールを保持するユーザーを実装するだけです。それはすべてIUserでなければなりません。 メソッドUserManagerがあります。でCreateUser(TUSERユーザー、文字列のパスワード)

+0

メンバーシッププロバイダとasp.netのID(OPが使用しているもの)は、2つの非常に異なり、ユーザー。 – Igor

+0

SHA1は基本的に壊れていると考えられています。それは確かに "すべての中で最も安全"ではなく、それを非常に強く推薦するための過失に接する。 –

関連する問題