前回 の続きで、ASP.NET Web アプリケーションでDotNetOpenAuth を使って OpenID によるユーザ認証を行います。

今回は、RealmとReturnToUrlを設定して認証後に戻ってくるURLを変更します。

 

【OpenID入力ページ】

demo3.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo3.aspx.cs" Inherits="Test.demo3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="Identifier" runat="server"></asp:TextBox>
        <asp:Button id="Login" runat="server" Text=" ログイン " EnableViewState="False" onclick="btnLogin_Click" /><br />
         <asp:Label ID="Result" runat="server" Text=""></asp:Label> 
    </div>
    </form>
</body>
</html>

 

demo3.aspx.cs

using System;
using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId;
using DotNetOpenAuth.OpenId.RelyingParty;

namespace WebTest
{
    public partial class demo3 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            if (!this.Page.IsValid)
            {
                return;
            }

            using (OpenIdRelyingParty rp = new OpenIdRelyingParty())
            {
                try
                {
                    // 認証後のページを設定
                    Uri uri = new Uri("http://" + Request.Url.Authority + "/demo3return.aspx");

                    // Realm(領域)を設定
                    Realm realm = new Realm("http://" + Request.Url.Authority);

                    // IAuthenticationRequestを作成 
                    var req = rp.CreateRequest(Identifier.Text.Trim(), realm, uri);

                    // OpenID Provider に リダイレクト
                    req.RedirectToProvider();
                }
                catch (ProtocolException ex)
                {
                    Result.Text = "ERROR:" + ex.Message;
                }
            }
        }
    }
}

 

【認証後のページ】

demo3return.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="demo3return.aspx.cs" Inherits="Test.demo3return" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>結果だけのページ</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
            <asp:Label ID="Result" runat="server" Text=""></asp:Label> 
    </div>
    </form>
</body>
</html>

 

demo3return.aspx.cs

using System;
using DotNetOpenAuth.OpenId.RelyingParty;

namespace Test
{
    public partial class demo3return : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //OpenIdRelyingPartyを作成
            OpenIdRelyingParty rp = new OpenIdRelyingParty();

            // IAuthenticationResponseを取得 
            var res = rp.GetResponse();
            if (res != null)
            {
                if (res.Status == AuthenticationStatus.Authenticated)
                {
                    Result.Text = "認証成功";
                }
                else
                {
                    Result.Text = "認証失敗";
                }
            }
        }
    }
}

 

参考URL

OpenID
http://ja.wikipedia.org/wiki/OpenID

Yahoo OpenIDとは?
http://openid.yahoo.co.jp/

livedoor Auth OpenID
http://auth.livedoor.com/openid/

mixi OpenID
http://developer.mixi.co.jp/openid

ASP.NET Web アプリケーションで DotNetOpenAuth を使って OpenID によるユーザ認証を行います。

DotNetOpenAuthは、OpenID, OAuth, InfoCardを簡単に使用する.NETのライブラリです。

DotNetOpenAuth
http://www.dotnetopenauth.net/

 

OpenIDは、Yahoo, Hatena, livedoor, mixiなどのアカウントを持っているならば、簡単に発行してもらえます。

下記コードでは「 http://profile.livedoor.com/YourID/ 」などと入力し、ログインボタンをクリックするとOpenIDによる認証を行うことができます。

 

demo1.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="Identifier" runat="server"></asp:TextBox>
        <asp:Button id="Login" runat="server" Text=" ログイン " EnableViewState="False" onclick="btnLogin_Click" /><br />
        <asp:Label ID="Result" runat="server" Text=""></asp:Label>
    </div>
    </form>
</body>
</html>

 

demo1.aspx.cs

using System;

using DotNetOpenAuth.Messaging;
using DotNetOpenAuth.OpenId.RelyingParty;

namespace Test
{
    public partial class demo1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            //OpenIdRelyingPartyを作成
            OpenIdRelyingParty rp = new OpenIdRelyingParty();

            // IAuthenticationResponseを取得 
            var res = rp.GetResponse();
            if (res != null)
            {
                if (res.Status == AuthenticationStatus.Authenticated)
                {
                    Result.Text = "認証成功";
                }
                else
                {
                    Result.Text = "認証失敗";
                }
            }
        }

        protected void btnLogin_Click(object sender, EventArgs e)
        {
            if (!this.Page.IsValid)
            {
                return;
            }

            using (OpenIdRelyingParty rp = new OpenIdRelyingParty())
            {
                try
                {
                    // IAuthenticationRequestを作成 
                    var req = rp.CreateRequest(Identifier.Text.Trim());

                    // OpenID Provider に リダイレクト
                    req.RedirectToProvider();
                }
                catch (ProtocolException ex)
                {
                    Result.Text = "ERROR1:" + ex.Message;
                }
            }
        }
    }
}

 

はてなの場合、SREG(OpenID Simple Registration Extension)を使用してニックネームの取得が可能です。

Page_Load

Result.Text = "認証成功";

//ニックネームを取得する
ClaimsResponse cr = res.GetExtension<ClaimsResponse>();
if (cr != null)
{
	Result.Text += cr.Nickname;
}

 

btnLogin_Click

// IAuthenticationRequestを作成 
var req = rp.CreateRequest(Identifier.Text.Trim());

//ニックネームを要求する
req.AddExtension(new ClaimsRequest
{
	Nickname = DemandLevel.Request
});

// OpenID Provider に リダイレクト
req.RedirectToProvider();

 

※Yahooはローカルで実行すると「このサイトには現在ログインできません。しばらく時間をおいてから再度お試しください。 」というエラーメッセージが表示されるかもしれません。

AjaXplorer のインストール で Ajaxplorer をインストールしましたが、Windows ではディレクトリの区切りにバックスラッシュ(\)を使用しているため、「..\..\..\..\」などと入力するとルートのフォルダでさえ見ることができてしまいます。

ということで、下記のような感じでバックスラッシュ(\)をスラッシュ(/)に変換するエスケープ処理を1行追加します(ディレクトリトラバーサル対策)。

AjaXplorer/server/classes/class.Utils.php

function securePath($path)
{
	if($path == null) $path = ""; 

	$path = str_replace('\\', '/', $path);

	$dirs = explode('/', $path);
	for ($i = 0; $i < count($dirs); $i++)
	{
		if ($dirs[$i] == '.' or $dirs[$i] == '..')
		{
			$dirs[$i] = '';
		}
	}

	$path = implode('/', $dirs);
	

	while (preg_match('/\/\//', $path)) 
	{
		$path = str_replace('//', '/', $path);
	}
	return $path;
}

Ruby on Rails で動くプロジェクト管理ツール「Redmine」をWindowsにインストールします。

DBにSQLite、WebサーバにMongrelを使用し、MongrelはWindowsのサービスとして起動させています。

環境
・Windows Server 2008 R2
・ActiveScriptRuby 1.8.7(p249)
・SQLite 3.6.22
・Redmine 0.9.1

 

1.Rubyインストール

ActiveScriptRuby からmsiファイルをダウンロードして実行。ウィザードに従いインストールします。
※今回はインストール先を「C:\ruby\」に変更しています。

インストール後、システム環境変数の「Path」の最後に「;C:\ruby\bin」を追加します。

ActiveScriptRuby
http://arton.hp.infoseek.co.jp/indexj.html

 

2.Ruby on Rails のインストール

コマンドプロンプトを起動し、下記コマンドを実行します。

gem install rails

 

3.RedCloth のインストール

Wiki で Textile を使用するため 下記コマンドを実行し、RedCloth をインストールします。

gem install RedCloth

 

4.DBの準備

今回はSQLiteを使用しますので、sqlite3を使えるようにします。

SQLite 公式サイト から Windows用バイナリファイルの sqlitedll をダウンロードし展開し、sqlite3.dllをパスの通ったフォルダにコピーします。
※今回は、システムフォルダ(C:\Windows\SysWOW64)にコピーしています。

SQLite 公式サイト
http://www.sqlite.org/

普通に「gem install sqlite3-ruby」でインストールするとエラーが発生するので、下記コマンドを実行し、riとrdocを除いてインストールします。

gem install sqlite3-ruby --no-ri --no-rdoc

 

5.Redmine のインストール

5.1.ダウンロード

下記のサイトからダウンロードします。
http://rubyforge.org/frs/?group_id=1850

5.2.ダウンロードしたファイルを展開し「c:\inetpub\redmine」にコピーします。

5.3.「redmine\config」にあります「database.yml.example」を参考にして、「database.yml」を作成します。

例)database.yml

production:
  adapter: sqlite3
  database: db/redmine.db
 
development:
  adapter: sqlite3
  database: db/redmine_development.db

test:
  adapter: sqlite3
  database: db/redmine_test.db

5.4.セッション暗号化用鍵を生成します。下記コマンドを実行します。

cd c:\inetpub\redmine
rake config/initializers/session_store.rb

5.5.データベースの初期化を行います。下記コマンドを実行します。

cd c:\inetpub\redmine
rake db:migrate RAILS_ENV=production
rake load_default_data RAILS_ENV=production

 

6.RedmineをWindowsサービスで稼働

6.1.Mongrelのインストール

Windowsサービスとして稼働する「mongrel_service」をインストール。下記コマンドを実行します。

gem install mongrel_service

6.2.Redmineをサービスへ登録

Redmine をサービスへ登録。下記コマンドを実行します。

mongrel_rails service::install -N "Redmine" -c c:\inetpub\redmine -p 3000 -e production
※ポート番号:3000, productionモードで登録

6.3.Redmine サービスの開始

下記のコマンドを実行し、登録したサービスを開始します。

net start Redmine

 

7.確認

ブラウザで http://localhost:3000/ にアクセスすると確認できます。ログインをクリックして、ユーザー名「admin」、パスワード「admin」でログインして使用できます。

001

 

参考サイト

Redmineのインストール
http://redmine.jp/tech_note/install/

redmineインストール・Windows Server + IIS編CommentsAdd Star
http://d.hatena.ne.jp/kamataro/20090519/1242750188

LINQ to Twitter を使って、投稿、削除、検索します。

投稿は UpdateStatus メゾットを使用します。

using System;
using System.Collections.Generic;
using System.Linq;
using LinqToTwitter;

class Program
{
	static void Main(string[] args)
	{
		ITwitterAuthorization auth = new UsernamePasswordAuthorization() 
		{ 
			UserName = "USERNAME", 
			Password = "PASSWORD" 
		};
		using (TwitterContext twitterCtx = new TwitterContext(auth, "https://twitter.com/", "http://search.twitter.com/"))
		{
			auth.SignOn();

			// 投稿する
			var tweet = twitterCtx.UpdateStatus("投稿する内容です");

			auth.SignOff();
			Console.ReadLine();
		}
	}
}

削除は DestroyStatus メゾットを使用します。下記コードは、投稿内容が「テスト」となっているものを削除しています。

var tweets = from tweet in twitterCtx.Status
	where tweet.Type == StatusType.Friends && 
		tweet.Text == "テスト"
	select tweet;

foreach (var tweet in tweets)
{
	var status = twitterCtx.DestroyStatus(tweet.StatusID);
}

検索は、Search メゾットを使用します。下記コードは、検索キーワード「ff13」で最初の3件を取得しています。

var queryResults = from search in twitterCtx.Search
	where search.Type == SearchType.Search &&
		search.Query == "ff13" &&
		search.Page == 1 &&
		search.PageSize == 3
		select search;

foreach (var search in queryResults)
{
	Console.WriteLine("Query: " + search.Query);
	Console.WriteLine();

	foreach (var entry in search.Entries)
	{
		Console.WriteLine("AuthorName: " + entry.Author.Name);
		Console.WriteLine("AuthorURI : " + entry.Author.URI);
		Console.WriteLine("Content   : " + entry.Content);
		Console.WriteLine("Published : " + entry.Published);
		Console.WriteLine();
	}
}