今までVisualStudio2003で1つのWebプロジェクトだったものを、VisualStudio2005へ手動でアップグレードすると共に2つのプロジェクトへ分割してみた。
すると、それまで気になっていなかった認証処理が各プロジェクト内で必要になり、仕方なくCookieを使う事に。またCookieがあれば自動でログインするにはどうすればいいか考えた結果、Login用のWebページのPage_LoadイベントにてFormsAuthentication.RedirectFromLoginPageを使えば問題ないみたい。
Loginコントロールを使っていたので、Authenticateイベントをコールバックしないといけない?と思ったが不要だった。
Login.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<!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="login" method="post" runat="server">
<asp:Login ID="Login1" runat="server" BackColor="#F7F6F3" BorderColor="#E6E2D8" BorderPadding="4"
BorderStyle="Solid" BorderWidth="1px" Font-Names="Verdana" Font-Size="0.8em"
ForeColor="#333333" DisplayRememberMe="False" OnAuthenticate="Login1_Authenticate">
<TextBoxStyle Font-Size="0.8em" />
<LoginButtonStyle BackColor="#FFFBFF" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px"
Font-Names="Verdana" Font-Size="0.8em" ForeColor="#284775" />
<InstructionTextStyle Font-Italic="True" ForeColor="Black" />
<TitleTextStyle BackColor="#5D7B9D" Font-Bold="True" Font-Size="0.9em" ForeColor="White" />
</asp:Login>
</form>
</body>
</html>
Login.aspx.cs
using System;
using System.IO;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Login : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// 初回表示時の処理
[ここでCookieをチェック。]
if ([Cookieが有効であれば])
{
FormsAuthentication.RedirectFromLoginPage([Cookieに格納されているユーザー名], false);
}
}
}
private void InitializeComponent()
{
}
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
e.Authenticated = false;
if ([カスタム認証処理])
{
// Cookieの発行
HttpCookie co = new HttpCookie([Cookieの格納名]);
[Cookieへユーザー名の格納]
Response.Cookies.Add(co);
e.Authenticated = true;
}
}
}
しかし、昔のソースはいつも書き直したくなってしまい妥協点を見出して作業に取り掛かるまで時間がかかる。
Comments