C# + MongoDBでログイン認証

 ASP.NET MVC + MongoDB環境でこのブログを作っている。今回はパスワード認証あたりが平文だったので、データベース直いじりで登録済みのパスワードをSHA256ハッシュにして、認証ロジックをそれに対応させた。

参考:http://dobon.net/vb/dotnet/string/md5.html

 パスワードにさらにユーザー名を付加し、それをなにかしらの文字列を使ってハッシュ化する。下記のようなメソッドを用意した。
private static string GetSHA256 (string userName, string pw)

{
//HMAC-SHA1を計算する文字列
var s = $"{userName}@{pw}";
//キーとする文字列
var key = "somestring";

//文字列をバイト型配列に変換する
byte[] data = System.Text.Encoding.UTF8.GetBytes(s);
byte[] keyData = System.Text.Encoding.UTF8.GetBytes(key);

byte[] bs;
//HMACSHA256オブジェクトの作成
using (var hmac = new HMACSHA256(keyData))
{
//ハッシュ値を計算
bs = hmac.ComputeHash(data);
}

//byte型配列を16進数に変換
var result = BitConverter.ToString(bs).ToLower().Replace("-", "");

return result;
}


 ハッシュ値を得るメソッドは用意したので、MongoDBに保存してあるユーザー情報と照会する。
public static bool Login(string id, string pw, IResponseCookies cookies)

{
var userCollection = DbConnection.db.GetCollection<BsonDocument>("user");
var filter = Builders<BsonDocument>.Filter.Eq("_id", id);
var doc = userCollection.Find<BsonDocument>(filter).FirstOrDefault<BsonDocument>();
if (doc == null)
{
return false;
}
else
{
var sha256 = GetSHA256(doc.GetValue("_id").AsString, pw);
if (sha256 != doc.GetValue("pw").AsString)
{
return false;
}
else
{
// 認証処理が続く
comment: 0

ASP.NET MVC: HTTPSリダイレクトとHSTS設定

 ASP.NET MVCを使ったWebアプリでの、セキュリティ処置をしておく。処置は全ページでのHTTPSへのリダイレクトと、HSTS(ブラウザにHTTPSアクセスを強制するもの)の設定。

 web.configを開いて適切な場所に下記を追加。
 
<system.webServer>


<rewrite>
<rules>
<rule name="HTTP to HTTPS redirect" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
redirectType="Permanent" />
</rule>
</rules>
<outboundRules>
<rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
<match serverVariable="RESPONSE_Strict_Transport_Security"
pattern=".*" />
<conditions>
<add input="{HTTPS}" pattern="on" ignoreCase="true" />
</conditions>
<action type="Rewrite" value="max-age=31536000" />
</rule>
</outboundRules>
</rewrite>

<handlers>


http://www.hanselman.com/blog/HowToEnableHTTPStrictTransportSecurityHSTSInIIS7.aspx
 上記の場所にあったコードをいただいた。HSTSをHTTPSアクセスにしか返さないようにしているが、これは仕様上の正しい実装になっているらしい。HSTS仕様を確認したところ、確かに、HSTS設定されたヘッダはセキュアな通信で返送してねと書かれていた。
comment: 0

C#, ASP.NET MVC: セキュアなトークンを取得する

 Webアプリで認証機能がある場合、認証成功時にセキュアなトークンを付与する必要がある。セキュアとはこのケースの場合、悪意のある第三者に予想がつかないということとする。
 参考になるものがすでにあったので、セキュアなトークンの取得方法のコードは書かない。
http://dobon.net/vb/dotnet/programing/random.html
http://stackoverflow.com/questions/1668353/how-can-i-generate-a-cryptographically-secure-pseudorandom-number-in-c

 たまーにセキュアであるべきトークンにUUID4系を使っているのを見かける。UUID4はまず重複することのない、ランダムなID、およびその生成方法である。これを使うのはセキュリティ的にはまずいとされている。
 UUID4は重複することはないだろうねというものである。予想がつかないものだとはされていない。セキュアであるトークンとは予想がついてはいけないものなので、UUID4はセキュアなトークンとして使うことはできない。
comment: 0