2016-12-21 9 views
1

これは、直接how to generate a unique token which expires after 24 hours?Base64Stringから特定のデータを取り出す方法は?

に関連している私は何を組み込むされませんしようとしています以下:(0〜6)

  1. ページ番号UTC形式で
  2. 現在の日付/タイムスタンプ
  3. とユニークなGUID

私がこれまで持っているコードはこれです

private string GenerateToken(Int32 pageNumber) 
{ 
    byte[] currentTimeStamp = BitConverter.GetBytes(DateTime.UtcNow.ToBinary()); 
    byte[] key = Guid.NewGuid().ToByteArray(); 
    byte[] newPageNumber = BitConverter.GetBytes(pageNumber); 
    string token = Convert.ToBase64String(newPageNumber.Concat(currentTimeStamp).Concat(key).ToArray()); 
    return token; 
} 

private tokenClass TokenAuthenticates(string token) 
{ 
    byte[] data = Convert.FromBase64String(token); 

    tokenClass _token = new tokenClass() 
    { 
     PageNumber = 0, 
     TokenDateTimeStamp = DateTime.FromBinary(BitConverter.ToInt64(data, 1)), 
     TokenKey = new Guid(), 
     Validates = (DateTime.FromBinary(BitConverter.ToInt64(data, 1)) < DateTime.UtcNow.AddHours(-2)) 
    }; 

    return _token; 
} 

デコーダのpageパラメータとguidパラメータはまだ把握されていないため、基本的にダミーです。

これを行うには何が必要ですか?

+0

何が問題なのですか? – CodingYoshi

+0

最初に...私はBase64Stringからページ番号を引き出すことができる必要があり、私はそれをどうするか考えていません。また、日付は、guidの2016ではなく1594のように表示されます。ページ番号と同じですが、validateは有効な日付のみに依存します。 –

+0

実際にはhavent ...私は参照されたSOページを適応しようとしていました。絶対に運がない。 –

答えて

3

は、このようなあなたのトークンを生成します。

private static string GenerateToken(Int32 pageNumber) 
{ 
    byte[] currentTimeStamp = BitConverter.GetBytes(DateTime.UtcNow.ToBinary()); 
    var keyGuid = Guid.NewGuid(); 
    byte[] key = keyGuid.ToByteArray(); 
    byte[] newPageNumber = BitConverter.GetBytes(pageNumber); 

    // date plus page number plus key 
    string token = Convert.ToBase64String(currentTimeStamp.Concat(newPageNumber).Concat(key).ToArray()); 
    return token; 
} 

は(あなたのTokenAuthenticates方法で)このようなトークンを読む:ここ

byte[] data = Convert.FromBase64String(token); 

// It will take eight bytes starting at index 0 
DateTime when = DateTime.FromBinary(BitConverter.ToInt64(data, 0)); 

// 8 first bytes was taken by date so lets skip 8 and then take 4 since page number is an integer and takes 4 bytes 
int pageNumber = BitConverter.ToInt32(data.Skip(8).Take(4).ToArray(), 0); 

// 8 bytes for date + 4 bytes for page number so we skip 12 and then take 16 for Guid 
// Guid can be generated directly from the bytes 
Guid key = new Guid(data.Skip(12).Take(16).ToArray()); 

が方法ですので、あなたが番号をハードコーディングする必要はありませんかサイズを決定する。あなたのための決意を行うにはsizeof演算子を使用します。

int pageNumber = BitConverter.ToInt32(data.Skip(sizeof(long)) 
        .Take(sizeof(int)).ToArray(), 0); 

// Skip date and pageNumber, the rest is Guid 
Guid key = new Guid(data.Skip(sizeof(long) + sizeof(int)).ToArray()); 

それがアクション動詞であり、より読みやすく、明確に聞こえるので、私はメソッドAuthenticateToken呼び出します。トークンを読んだら、さらに検証を行うことができます。トークンの暗号化も検討するとよいでしょう。

+0

私は実際に正しい軌道に乗っていましたが、guidにこだわっていました.... ty –

+0

はい、そうでしたので、混乱を避けるためにコードにコメントを入れています。 – CodingYoshi

関連する問題