WebService Security Enforcement を IAuthenticationModule で実装してみたんだけど

実装してみたんだけど、Hatena のサービスだけ Invalid login でアクセスできない。
軽く調べてみると、g:tech:id:koseki:20050520 にあるように、仕様書の解釈が2通りあるらしく、私が仕様書を見てテキトーに実装したのは type-B だった。Hatena は type-A じゃないと動かないのか? と実装を調整して試してみたら、やっぱり Invalid login で動きません。
色々やってみて、やっと認証がとおったのは、パスワードの文字列を SHA1 に投げるときのエンコードの指定が間違っていた! というオチでした。とりあえずパスワードを UTF-8 でバイト列にすることで認証が通りましたとさ。
たとえば、はてなグラフ数値登録APIを利用して Hatena::Graph に値を追加するメソッドは、こんな感じ

namespace HatenaAPI
{
    public static class Graph
    {
        public static bool Update(string graphName, DateTime date, int value)
        {
            HttpWebRequest req = WebRequest.Create("http://graph.hatena.ne.jp/api/post") as HttpWebRequest;

            CredentialCache cache = new CredentialCache();
            cache.Add(new Uri("http://graph.hatena.ne.jp/"), "WSSE",
                new NetworkCredential(username, password));

            byte[] buffer = Encoding.UTF8.GetBytes(string.Format(
                "graphname={0}&date={1:yyyy-MM-dd}&value={2}",
                HttpUtility.UrlEncode(graphName), date, value));

            req.Credentials = cache;
            req.Method = "post";
            req.ContentType = "application/x-www-form-urlencoded";
            req.ContentLength = buffer.Length;

            using (Stream s = req.GetRequestStream())
                s.Write(buffer, 0, buffer.Length);

            using (HttpWebResponse res = req.GetResponse() as HttpWebResponse)
                return res.StatusCode == HttpStatusCode.Created;
        }
    }
}

AuthenticationModule を追加しているので、BASIC 認証などとまったく違いはありません。rss を読んで idea:398 を外部から実現するツールぐらいは、すぐつくれそうですね。(認証の問題があるので自分用になりそうですが)
AuthenticationModule そのものは、150 行ぐらいのソースだけど、ここに貼り付けるにはちょっとでかいよね。