.NET TIPS

[ASP.NET]匿名ユーザーごとのプロファイル情報を保存するには?[2.0のみ、C#、VB]

山田 祥寛
2006/08/18

 「TIPS:[ASP.NET]ユーザーごとのプロファイル情報を管理するには?」でも紹介したように、ASP.NET 2.0で新たに導入されたプロファイル機能を利用することで、ユーザー単位の情報(プロファイル情報)をわずかなコーディングのみで容易に管理することができる。

 もっとも、前掲のTIPSではプロファイル機能を利用するためにユーザー認証を行うことを前提にしていたので、やや回りくどいと感じられた読者もいたかもしれない。しかし、ASP.NET 2.0のプロファイル機能では、ちょっとした設定を追加することで、匿名ユーザーからもプロファイル情報を保存することが可能になる。

 これにより、ユーザー固有の設定情報を、認証を行わずに管理することができる(基本的にクッキーにより識別されるので、正確には接続するPCごとの設定情報となる)。

 そこで本稿では、前掲のTIPSのサンプル・プログラムを匿名ユーザーからも利用できるように変更してみよう。

1. 匿名ユーザーの識別を有効にする

 匿名ユーザーがプロファイル機能を利用するには、まず匿名ユーザーの識別機能(匿名識別)が有効になっていなければならない。匿名識別を有効にするには、構成ファイルWeb.configに以下のような記述を追加すればよい。

<?xml version="1.0"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <system.web>
    <anonymousIdentification enabled="true" />
    ……中略……
  </system.web>
</configuration>
匿名識別を有効にする定義(Web.config)
<anonymousIdentification>要素のenabled属性をtrueに設定する。

 <anonymousIdentification>要素のenabled属性をtrueに設定することで、ASP.NETは内部的にGUID(Globally Unique Identifier)を発行し、それをクッキーに保存することで、匿名ユーザーを識別するというわけだ。

 ほかにも<anonymousIdentification>要素ではクッキーの設定などに関する以下のような属性を設定可能だ。

属性 概要 デフォルト
cookieless GUIDの授受にクッキーを使用するか UseCookies
設定値 概要
AutoDetect 自動識別。デバイスがクッキー未サポートの場合はクエリ情報を利用
UseCookies 常にクッキーを使用
UseDeviceProfile HttpBrowserCapabilitiesの設定に基づいてクッキーを使うかどうかを判定(デバイスがクッキー未サポートの場合はクエリ情報を利用)
UseUri 常にクエリ情報を利用
cookieName クッキー名 .ASPXANONYMOUS
cookiePath クッキーのパス /(ルート)
cookieProtection クッキーの保護方法 Validation
設定値 概要
All 検証/暗号化の双方を行う
Encryption 暗号化のみ
Validation クッキー値の検証のみ行う
None 検証/暗号化ともに行わない
cookieReuireSSL クッキー送信にSSL通信を要求するか false
cookieSlidingExpiration スライド式の有効期限を使用するか true
cookieTimeout クッキーの有効期限 10000分(69日10時間40分)
domain クッキーのドメイン
enabled 匿名識別を有効にするか false
<anonymousIdentification>要素で指定可能な主な属性

2. プロファイル・プロパティを匿名ユーザーに対応する

 以上で、アプリケーション上での匿名識別が有効になった。しかし、ここまでの設定ではアプリケーションとして匿名ユーザーによるプロファイル機能の利用を認めただけで、個々のプロファイル・プロパティはデフォルトで匿名ユーザーによる利用を無効にしているので注意すること。

 個々のプロファイル・プロパティで匿名ユーザーによる利用を可能にするには、別稿でも紹介した<profile>要素の設定を編集する必要がある。具体的には次のような属性を追加する。

<profile enabled="true">
  <properties>
    <add name="MyTheme" type="String" allowAnonymous="true" />
  </properties>
</profile>
匿名ユーザーによるアクセスを有効化(Web.config)
<add>要素のallowAnonymous属性でtrueを指定する。

 以上の設定を行ったら、前掲のTIPSと同じ要領でProfile.aspxの動作を確認してみよう。認証ユーザーと同様に、画面で設定したプロファイルがブラウザを閉じた後も保持されることが確認できるはずだ。

■不要となったプロファイル情報の削除

 なお、ASPNETDB.mdfを参照すれば、ASP.NET 2.0が匿名ユーザーに対して、内部的にランダムなユーザーID(GUID)を割り当てていることも確認できるはずだ。

匿名ユーザーがプロファイルを保存した場合
匿名ユーザーがプロファイルを利用した場合、ASP.NET内部ではユーザーIDが自動採番される。ここでは「83bf86ce-66ef-4aa3-915d-a10712d609d9」。

 このユーザーIDをクライアント側にクッキーとして保存することで、プロファイル情報と匿名ユーザーとの関連付けを行っているというわけだ。従って、クライアント側でクッキーを削除してしまえば、プロファイルの関連付けはなくなってしまうので、aspnet_Profileテーブルで管理されたプロファイル情報は誰からも参照されないゴミとして残ってしまうことになる。

 匿名ユーザーに対してプロファイル機能を有効にした場合には、このようなゴミを定期的に削除する必要があるだろう。一定期間アクセスされないプロファイル情報を削除するには、以下のようなコードを記述すればよい。

SqlProfileProvider provider =
  (SqlProfileProvider)Profile.Providers["AspNetSqlProfileProvider"];
provider.DeleteInactiveProfiles(
  ProfileAuthenticationOption.Anonymous, DateTime.Now.AddMonths(-3));
Dim provider As SqlProfileProvider = _
  CType(Profile.Providers("AspNetSqlProfileProvider"), SqlProfileProvider)
provider.DeleteInactiveProfiles( _
  ProfileAuthenticationOption.Anonymous, DateTime.Now.AddMonths(-3))
3カ月間アクセスされないプロファイル情報を削除するコード(上:C#、下:VB)

 “AspNetSqlProfileProvider”はMachine.configファイルで定義されたデフォルトのプロファイル・プロバイダだ。ここではデフォルトで指定されているAspNetSqlProfileProviderプロバイダ(SqlProfileProviderオブジェクト)を取得し、SqlProfileProvider.DeleteInactiveProfilesメソッドで非アクティブなプロファイル情報を削除している。

 DeleteInactiveProfilesメソッドの構文は以下のとおり。

public override int DeleteInactiveProfiles(
    ProfileAuthenticationOption authenticationOption,
    DateTime userInactiveSinceDate
)
Public Overrides Function DeleteInactiveProfiles( _
    authenticationOption As ProfileAuthenticationOption, _
    userInactiveSinceDate As DateTime _
) As Integer
DeleteInactiveProfilesメソッドの構文(上:C#、下:VB)

 第1パラメータには削除対象のプロファイル情報をProfileAuthenticationOption列挙体(System.Web.Profile名前空間)の値で指定する。ProfileAuthenticationOption列挙体のメンバ(値)は以下のとおりだ。

メンバ 概要
All すべてのプロファイルを検索
Anonymous 匿名プロファイルのみ検索
Authenticated 認証済みプロファイルのみ検索
ProfileAuthenticationOption列挙体の主なメンバ(値)

 ここでは“Anonymous”値を指定しているので、匿名ユーザーのプロファイルのみを削除しているが、認証/匿名を問わず、削除対象としたい場合には“All”値を指定すればよい。

 第2パラメータには、削除対象となる時刻(DateTimeオブジェクト)を指定する。プロファイル情報へのアクセスが、ここで指定された時刻より以前であった場合に、プロファイル情報は非アクティブであると見なされ、データベースから削除される(ここではAddMonthsメソッドで3カ月前の日時を取得しているので、3カ月以上アクセスがなかったプロファイル情報を削除していることになる)。

 もっとも、削除にわざわざ人手をかけたくないという場合には、上記のようなコードをバッチ・ファイルとして用意しておき、タスク・スケジューラなどで定期的に実行することもできるだろう。タスク・スケジューラの利用方法については、「Windows TIPS:タスク・スケジューラとWSHで定例処理を実現する」をご参照いただきたい。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Webフォーム 処理対象:プロファイル
使用キーワード:<anonymousIdentification>要素
使用キーワード:<profile>要素
使用ライブラリ:ProfileAuthenticationOption列挙体(System.Web.Profile名前空間)
関連TIPS:TIPS:[ASP.NET]ユーザーごとのプロファイル情報を管理するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET]ユーザーごとのプロファイル情報を管理するには?
[ASP.NET]メンバシップAPIでユーザー情報の編集を行うには?
[ASP.NET AJAX]DragPanelコントロールのパネル位置を保存するには?
[ASP.NET AJAX]クライアントサイド・スクリプトからASP.NETのプロファイル機能を利用するには?
Visual Studio 2013:IDE右上のユーザー名とアイコンを変えるには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間