クライアントアプリからブラウザを開いて自動ログインする方法


######動作環境
Windows XP,7
.NET Framework 2.0以上

[Aipoリマインダー](http://www.vector.co.jp/soft/winnt/net/se476433.html "Aipoリマインダー")で実装している自動ログインの方法を公開します。

##１．ブラウザに渡すhtmlファイルを用意する

```html:autologin.html
<html>	<head>		<noscript>			<meta http-equiv="Refresh" content="0; url={0}">		</noscript>	</head>	<body onLoad="document.pform.submit();window.focus();">		<form name="pform" action="{0}" method="post">			<input type=hidden name="username" value="{1}">			<input type=hidden name="password" value="{2}">			<input type=hidden name="action" value="ALJLoginUser">			<input type=hidden name="org" value="">		</form>	</body></html>```

基本的に、ログイン画面に設定されているパラメータのみをPOSTするようなhtmlを作成します。

{0}…ログイン画面のformのactionと同じ値
{1}…ログインユーザー名
{2}…パスワード

これ以外に必要なパラメータがあれば適宜追加すること。
<font size="-1">
よくよく考えたら、body onloadでsubmitしてるから「&lt;meta http-equiv="Refresh" content="0; url={0}"&gt;」は要らなかったかも。
現状、これでうまく行っています。
</font>

##２．{0}〜{2}に値をセットする処理

値をセットしたものを別のファイルかリソースとして保持しておきます。

##３．ログイン情報のセット済みhtmlファイルをブラウザに渡す

ログイン情報のセット済みhtmlファイルをテンポラリディレクトリに作ります。
そのときのファイル名はランダムなものにしておき、拡張子は.htmlとします。
あとは、そのhtmlファイルをブラウザに渡すために、Process起動します。
コードを見た方が早いですね。


```c#:ThreadingManager.cs
using System;using System.Diagnostics;using System.IO;using System.Text;using System.Threading;using AipoReminder.Utility;using WinFramework.Utility;using System.Reflection;namespace AipoReminder.Manager{    class ThreadingManager    {        private string path = "";        public ThreadingManager()        {        }        public void setBrowserPath(string path)        {            this.path = path;        }        public void Run()        {            if (SettingManager.AutoLogin)            {                // 自動ログイン用のファイルを作成                string fullPath = Path.GetTempPath();                fullPath += @"AipoReminder\";                string fileName = Path.GetRandomFileName();                fullPath += fileName;                string changeFileName = Path.ChangeExtension(fullPath, ".html");                // Shift-Jisでファイルを作成                StreamWriter sw = new StreamWriter(changeFileName,                                                   true,                                                   Encoding.GetEncoding("Shift_Jis"));                sw.WriteLine(SettingManager.AutoLoginHtml);                // ストリームを閉じる                sw.Close();                // ブラウザで表示                this.OpenUrl("\"" + changeFileName + "\"");            }            else            {                // ブラウザで表示                this.OpenUrl("");            }        }        /// <summary>        /// 指定のURLを標準ブラウザで開く        /// </summary>        /// <param name="targetUrl"></param>        private void OpenUrl(String targetUrl)        {            string arg = "";            if (String.IsNullOrEmpty(targetUrl))            {                arg = SettingManager.Url;            }            else            {                arg = targetUrl;            }            ProcessStartInfo info = new ProcessStartInfo();            Process p = null;            if ("".Equals(path))            {                info.FileName = WinFramework.Utility.RegistryUtility.GetDefaultBrowserExePath();                info.WorkingDirectory =
					 Path.GetDirectoryName(
						WinFramework.Utility.RegistryUtility.
						GetDefaultBrowserExePath());            }            else            {                info.FileName = path;                info.WorkingDirectory = Path.GetDirectoryName(path);            }            info.Arguments = arg;            p = Process.Start(info);            p.WaitForInputIdle(60000);        }    }}```

SettingManager.AutoLoginは、自動ログインさせるかどうかの設定情報です。
SettingManager.AutoLoginHtmlは、ブラウザに渡すhtmlファイルに{0}〜{2}の値をセットしたリソースです。
WinFramework.Utility.RegistryUtilityは、レジストリからデフォルトのブラウザのパスを取得するUtilityです。

使い方はこのようになります。

```
ThreadingManager threadingManager = new ThreadingManager();
// ブラウザ指定で自動ログインする場合
//threadingManager.setBrowserPath("ブラウザの実行ファイルのパス");
Thread thread = new Thread(new ThreadStart(threadingManager.Run));
thread.Start();```