「.NET」カテゴリーアーカイブ

認証Cookieにsecureオプションを付ける

web.configで認証Cookieにsecureオプションを付ける。

<?xml version="1.0" encoding="shift_jis"?>
<configuration>
  <system.web>
    .... (中略) ....
    <authentication mode="Forms">
      <forms name="NETWSSample"
             loginUrl="Login/Login.aspx" 
             protection="All"
			requireSSL="true"
             timeout="30" path="/" />
    </authentication>
    .... (中略) ....
  </system.web>
</configuration>

認証CookieにHttpOnly属性やsecureオプションを付ける。

using System.Web.Security;
protected void Application_EndRequest(Object sender, EventArgs e)
{
	string authCookieName = FormsAuthentication.FormsCookieName;
	foreach (string sCookie in Response.Cookies) 
	{
		if (sCookie == authCookieName) 
		{
			// クロスサイトスクリプティング脆弱性に対する多重防衛
			Response.Cookies[sCookie].Path += ";HttpOnly";
			// SSLセッション外に認証クッキー情報を出さない
			// (.NET Framework 1.0用)
			// Response.Cookies[sCookie].Secure = true;
		}
	}
}

※ HttpOnly属性を付与すると、document.cookieプロパティからクッキー情報を取り出せなくなるため、安全性が高まる。ただしHttpOnly属性は、IE6SP1以降でしかサポートされていない。
参考: 「.NETエンタープライズWebアプリケーション開発技術大全Vol.4 セキュアアプリケーション設計編」4.2.6

Windows サービスを柔軟に管理するサービスマネージャの製作

Windows サービスを柔軟に管理するサービスマネージャの製作:パート1 - japan.internet.com デベロッパー
Windows サービスを柔軟に管理するサービスマネージャの製作:パート2 - japan.internet.com デベロッパー
AppDomain、AppDomainSetupの使用方法が分かるサンプルがある。

// create the service app domain
AppDomain svcDomain = null;
try
{
	AppDomainSetup setup = new AppDomainSetup();
	// use the process base directory as the new domain base and bin path
	setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
	setup.PrivateBinPath = setup.ApplicationBase;
	// use the assembly full name as friendly name
	setup.ApplicationName = asmName.FullName;
	// the base will be the shadow copy 'from' directory
	setup.ShadowCopyDirectories = setup.ApplicationBase;
	// enable shadow copying
	setup.ShadowCopyFiles = "true";
	// create the domain with no CAS evidence
	svcDomain = AppDomain.CreateDomain(asmName.FullName, null, setup);
}
catch (Exception ex)
{
	Logger.LogException(
		new ApplicationException(
			String.Format("Could not create an AppDomain for '{0}'; bypassing that assembly.", 
			asmName.FullName), ex));
	return;
}
// Get remote service handler
RemoteServiceHandler svc = null;
try
{
	// This call will actually create an instance
	// of the service handler in the service domain
	// and return a remoting proxy for us to act on.
	// This is important because we don't want to 
	// load any type info from the service assembly
	// into this assembly
	svc = (RemoteServiceHandler)  
		svcDomain.CreateInstanceFromAndUnwrap(
		svcDomain.BaseDirectory + "\\ServiceBroker.dll", 
		"ServiceBroker.RemoteServiceHandler");
}
catch (Exception ex)
{
	// unload domain
	AppDomain.Unload(svcDomain);
	Logger.LogException(
		new AssemblyLoadException(
			"Could not load ServiceBroker remote service handler, bypassing that file.",
		asmName.FullName, ex));
	return;
}

これは、被管理サービスの実行に使う新しいAppDomainをセットアップするコードです。AppDomainSetupオブジェクトを使用しているのは、AppDomain.CreateDomainのオーバーロードにはないオプションがあるためです。ここでは、ディレクトリプロパティを、現アプリケーションディレクトリを指し示すように設定することと、ファイルのシャドウコピーを作成するよう指示することが重要です。シャドウコピーを作成することによって、アセンブリがアプリケーションディレクトリでロックされることを防止できます。ここで例外がスローされることはまずないと思われますが、それでも、何が起こったかをログに記録するためと、スレッドを例外で終わらせないために、例外を正確にキャッチするようにしました。アプリケーションにユーザインタフェースがないときは、こうやって例外をキャッチし、ログに記録することをお勧めします。

.NETでアセンブリバインドのエラーログを有効にするには

アセンブリ バインドのエラー ログを有効にするには、以下のレジストリ値をセットする。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Fusion]
"EnableLog"=dword:00000001

上記内容を拡張子.regのファイル名で保存してダブルクリックすれば、レジストリに登録できる。

オフにするには、このレジストリ値をregeditで削除する。

Assembly probing, Fusion and fuslogvw in 5 minutes - B# .NET Blog