Windows 7 Professional 64 Bit Internet Explorer 8 IIS 7 Oracle Database 11g Release 2 64 Bit Oracle 11g ODAC and Oracle Developer Tools for Visual Studio 11.2.0.1.2 Visual Web Developer 2010 Express |
■仮登録処理 | Prev Top Next |
関連ページ:なし |
1. Web画面上でメールアドレスの登録。これを仮登録とする。
2. 仮登録を行うと、入力されたメールアドレスに対し本登録案内メールが送信される。
3. メールの本文に本登録ページへのリンクがはられているので、ジャンプして本登録画面表示
4. 本登録画面上で本登録を行う。
こんな感じです。まあ一般的なアカウント登録処理ってこんな感じだと思います。
仮登録なんて面倒だよねとか思ってる人がいるかもしれないので一応説明すると、
仮登録は、有効なメールアドレスを確実に登録してほしいからです。
運営側からユーザーにメールにて何らかの連絡をするとき、メールアドレスが間違って登録されてたら
連絡できなくなります。
そのためメールアドレスをまず仮登録という形で登録してもらって、ユーザーにメールを送信し、
ユーザーがメールを受け取れたら、入力されたメールアドレスは有効であると判断できるわけです。
さて、ではいよいよソースを見ていきます。
<?xml version="1.0" encoding="utf-8"?> <!-- ASP.NET アプリケーションの構成方法の詳細については、 http://go.microsoft.com/fwlink/?LinkId=169433 を参照してください --> <configuration> <!-- Oracleの設定 --> <connectionStrings> <add name="Sample" connectionString="User ID=MAVERICK;Password=PROJECT;Data Source=SAMPLE_ORCL" providerName="Oracle.DataAccess.Client" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.0" > </compilation> </system.web> <system.webServer> <directoryBrowse enabled="true" /> </system.webServer> </configuration>
Webサイトの設定ファイルです。データベースへの接続文字列を"Sample"という名称で参照できるようにします。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Step01.aspx.cs" Inherits="AccountSample.Step01.Step01" %> <!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> <br /> 仮登録を行います。メールアドレスを入力して送信ボタンをクリックしてください。 <br /> 登録後、本登録の案内メールが届きます。 <p></p> <div style="color:red;"> ※携帯電話のメールアドレスは使用できません。<br /> ※全角文字は使用できません。<br /> ※60文字以内で入力してください。<br /> </div> <p></p> メールアドレス:<asp:TextBox ID="Txt_Mail" Width="500px" MaxLength="60" runat="server"></asp:TextBox> <asp:Label ID="Lbl_E_Mail" runat="server" Text=""></asp:Label> <p></p> <asp:Button ID="Cmd_MailCheck" runat="server" Text="仮登録" OnClick="Cmd_MailCheck_Click" /> <asp:Label ID="Lbl_Msg" runat="server" Text=""></asp:Label> <p></p> <hr /> <div style="color:Blue;"> この処理は入力されたメールアドレスが有効であるかを確認するためのものです。 <br /> メールアドレスは本人確認のためのキー情報となるため確実な情報が必要となります。 </div> </div> </form> </body> </html>
aspxファイルは一般的に画面のデザインを行います。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Oracle.DataAccess.Client; using System.Net.Mail; using System.Text; using System.Configuration; namespace AccountSample.Step01 { public partial class Step01 : System.Web.UI.Page { enum EMAIL_ENUM { OK = 0, // 登録ok REGISTERED = 1, // 既に登録済み ERROR = -1, // 更新エラー }; protected void Page_Load(object sender, EventArgs e) { Txt_Mail.Focus(); } // メールアドレス登録処理 private EMAIL_ENUM UpdateMailAddress( OracleConnection connection, string pE_Mail, out string pUID ) { EMAIL_ENUM hr = EMAIL_ENUM.ERROR; OracleCommand command = null; OracleDataReader reader = null; pUID = ""; try { // OracleCommandを作成 command = new OracleCommand(); command.Connection = connection; // 入力されたメールアドレスが、ユーザーマスタに登録すみかチェックするSQLコマンド command.CommandText = ""; command.CommandText += "SELECT"; command.CommandText += " * "; command.CommandText += " FROM USER_MASTER"; command.CommandText += " WHERE E_MAIL='" + pE_Mail.Replace("'", "''") + "'"; command.CommandText += " AND DELETEDATE IS NULL "; // SELECT文を実行 reader = command.ExecuteReader(); // 登録済みデータ件数0件 if (reader.Read() == false) { // クローズ reader.Close(); reader.Dispose(); reader = null; // 順序を取得するためのSQLコマンド command.CommandText = ""; command.CommandText += "SELECT"; command.CommandText += " USER_MASTER_SEQ.NEXTVAL AS NEXT_ID"; command.CommandText += " FROM DUAL"; reader = command.ExecuteReader(); if (reader.Read() == true) { decimal nextid = (decimal)reader["NEXT_ID"]; pUID = nextid.ToString(); reader.Close(); reader.Dispose(); reader = null; // 追加登録処理 command.CommandText = ""; command.CommandText += "INSERT INTO USER_MASTER"; command.CommandText += "( "; command.CommandText += " USERID,"; command.CommandText += " E_MAIL,"; command.CommandText += " PASSWORD,"; command.CommandText += " NAME,"; command.CommandText += " ADDRESS,"; command.CommandText += " SEX,"; command.CommandText += " BIRTHDAY,"; command.CommandText += " FREECOMMENT,"; command.CommandText += " CREATEDATE, "; command.CommandText += " UPDATEDATE,"; command.CommandText += " DELETEDATE"; command.CommandText += ") "; command.CommandText += " VALUES "; command.CommandText += "( "; command.CommandText += " " + pUID + ","; command.CommandText += " '" + pE_Mail.Replace("'", "''") + "',"; command.CommandText += " '',"; command.CommandText += " '',"; command.CommandText += " '',"; command.CommandText += " '',"; command.CommandText += " '',"; command.CommandText += " '',"; command.CommandText += " SYSDATE,"; command.CommandText += " '',"; command.CommandText += " ''"; command.CommandText += ") "; // INSERT文を実行 command.ExecuteNonQuery(); } } // 既に登録済み else { hr = EMAIL_ENUM.REGISTERED; goto EXIT; } } catch (Exception ex) { // 例外処理 goto EXIT; } hr = EMAIL_ENUM.OK; EXIT: if (reader != null) { reader.Close(); reader.Dispose(); reader = null; } return hr; } // メール送信処理 private bool SendMail(string pE_Mail, string pUID ) { bool hr = false; // MailMessageの作成 MailMessage msg = new MailMessage(); try { // 送信者 msg.From = new MailAddress("me434384@members.interq.or.jp", "Maverick Project"); // 宛先 msg.To.Add(new MailAddress(pE_Mail, "")); // ここから件名 // 件名の文字コード msg.SubjectEncoding = Encoding.UTF8; // 件名 msg.Subject = "本登録のお知らせ"; // ここから本文 // 本文を html 形式 msg.IsBodyHtml = true; // 本文の文字コード msg.BodyEncoding = Encoding.UTF8; string UID = "000000" + pUID; UID = UID.Substring(UID.Length - 6); // 本番環境を構築する際は localhost ではなくWebサーバー名を指定すること string Link = "http://localhost/OracleSample/Step02/Step02_1.aspx?UID=" + UID; msg.Body = ""; msg.Body += "<html>"; msg.Body += " <head>"; msg.Body += " <title>【 Maverick Project 】本登録のお知らせ</title>"; msg.Body += " </head>"; msg.Body += " <body>"; msg.Body += " お客様のユーザーIDを発行しました。<br/>"; msg.Body += " ユーザーIDはログイン時に必要となりますので控えておいてください。<p/>"; msg.Body += " ユーザーID:<strong>" + UID + "</strong>"; msg.Body += " <p/>"; msg.Body += " <hr>"; msg.Body += " 下記のURLをクリックして表示されるページ上で<br/>"; msg.Body += " 必要項目を入力し、本登録を完了してください。<p />"; msg.Body += " <a href='" + Link + "'>" + Link + "</a><br />"; msg.Body += " </body>"; msg.Body += "</html>"; // SMTPサーバの名前とポート番号は、メールアカウントを取得した際にプロバイダから通知された設定を使用すること SmtpClient sc = new SmtpClient(SMTPサーバの名前, ポート番号); sc.Timeout = 100000; // ユーザー名とパスワードは、メールアカウントを取得した際にプロバイダから通知された設定を使用すること sc.Credentials = new System.Net.NetworkCredential(ユーザー名, パスワード); // セキュリティで保護された接続(SSL)が必要でない sc.EnableSsl = false; // メッセージを送信する sc.Send(msg); } catch (Exception ex) { // 例外処理 goto EXIT; } hr = true; EXIT: // 後始末 msg.Dispose(); return hr; } // 仮登録ボタンをクリックした protected void Cmd_MailCheck_Click(object sender, EventArgs e) { Lbl_E_Mail.Text = ""; Lbl_Msg.Text = ""; OracleConnection connection = null; OracleTransaction tran = null; string E_Mail = Txt_Mail.Text.Trim(); // メールアドレス未入力 if (E_Mail.Length == 0) { Lbl_E_Mail.Text = "メールアドレスを入力してください。"; Lbl_E_Mail.ForeColor = System.Drawing.Color.Red; Txt_Mail.Focus(); goto EXIT; } // 全角文字を使用しているかチェック if (Encoding.GetEncoding("Shift_JIS").GetBytes(E_Mail).Length != E_Mail.Length) { Lbl_E_Mail.Text = "半角文字だけで入力してください。"; Lbl_E_Mail.ForeColor = System.Drawing.Color.Red; Txt_Mail.Focus(); goto EXIT; } // 有効なメールアドレスであるかを可能な限りチェックする // ウィキペディア if (E_Mail.Split('@').Length != 2 || // ローカル部とドメイン部の両方を持たない E_Mail.Split('@')[0].Length == 0 || // ローカル部が空文 E_Mail.Split('@')[1].Length == 0 // ドメイン部が空文 ) { Lbl_E_Mail.Text = "有効なメールアドレスを入力してください。"; Lbl_E_Mail.ForeColor = System.Drawing.Color.Red; Txt_Mail.Focus(); goto EXIT; } // 携帯電話のメールチェック // とりあえず入力された文字列のドメイン名で適当にチェックする。足りないので追加して。 // 携帯電話の場合、受け取れる文字数に制限があったりするので禁止したりするみたい。 if (E_Mail.IndexOf("docomo.ne.jp") != -1 || // docomo E_Mail.IndexOf("softbank.ne.jp") != -1 // ソフトバンク ) { Lbl_E_Mail.Text = "携帯電話のメールアドレスは使用できません。"; Lbl_E_Mail.ForeColor = System.Drawing.Color.Red; Txt_Mail.Focus(); goto EXIT; } try { // OracleConnectionを作成 connection = new OracleConnection(ConfigurationManager.ConnectionStrings["Sample"].ToString()); // データベース接続 connection.Open(); } catch( Exception ex ) { Lbl_Msg.Text = "データベースに接続できません。"; Lbl_Msg.ForeColor = System.Drawing.Color.Red; goto EXIT; } // トランザクションを作成 tran = connection.BeginTransaction(); // メールアドレス登録処理 string UID; switch (UpdateMailAddress( connection, E_Mail, out UID ) ) { case EMAIL_ENUM.ERROR: // ロールバック tran.Rollback(); Lbl_Msg.Text = "メールアドレスの登録に失敗しました。"; Lbl_Msg.ForeColor = System.Drawing.Color.Red; goto EXIT; case EMAIL_ENUM.OK: Lbl_Msg.Text = "メールアドレスを登録しました。"; Lbl_Msg.ForeColor = System.Drawing.Color.Blue; // 本登録用の案内メール送信 if (SendMail(E_Mail, UID) == false) { // ロールバック tran.Rollback(); Lbl_Msg.Text = "メールの送信に失敗しました。"; Lbl_Msg.ForeColor = System.Drawing.Color.Red; goto EXIT; } else { Lbl_Msg.Text = "メールを送信しました。受信したメールの内容を確認し、本登録を行ってください。"; Lbl_Msg.ForeColor = System.Drawing.Color.Blue; } break; case EMAIL_ENUM.REGISTERED: // ロールバック tran.Rollback(); Lbl_Msg.Text = "入力されたメールアドレスは既に登録されています。"; Lbl_Msg.ForeColor = System.Drawing.Color.Red; goto EXIT; } // コミット tran.Commit(); EXIT: // データベース切断 if (connection != null) { connection.Close(); connection.Dispose(); connection = null; } } } }
ちょっとだけ説明します。
まず順序を取得して USER_MASTER の USERID 項目に格納するところ。 USERID 項目はログイン時に使用するキー情報となりますが、ぶっちゃけキー情報は E_MAIL 項目でもいいです。 ただ今後の処理ででてきますが、メールアドレスを GET送信のパラメータに設定して 大丈夫なのかが不明なんです( &や?といったURL上の予約語がメールアドレスに含まれたりしないか不明 )。 ですので E_MAIL 項目とは別にキーを持たせることにしました。
次にメールの設定。これはコメントにも書いてますが、メールアカウントを取得した際にプロバイダから通知された設定を使用してください。この辺を修正しないでそのまま実行してもエラーになります。
次に携帯電話のメールを使用しているかのチェック。これ微妙。実際どうやってチェックしているのか( いやそもそもチェックしているか? )不明です。 なのでとりあえず、決め打ちにしてます。
最後にこのサンプルはクロスサイトスクリプティング対策してないのでご注意を。
いやASP.NET側でチェックはしてくれるようですが、システムチックなエラー画面が表示されるので、カスタムエラーページを表示するようにしたほうがいいと思います。
なおクロスサイトスクリプティング対策については下記のページを参照してください。
クロスサイトスクリプティング対策の基本(前編)