私は、ユーザーを認証するためのやや自作の方法を使用しています。ユーザーを認証した後、認証チケットは C# のように設定されます。
FormsAuthenticationTicket authenticationTicket = new FormsAuthenticationTicket(1, viewModel.Email, DateTime.Now, DateTime.Now.AddHours(48), true, String.Join("|", roles));
string encryptedTicket = FormsAuthentication.Encrypt(authenticationTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(authCookie);
ロールは、そのユーザーが使用できるロールから構築された文字列リストであることに注意してください (ロールは同じユーザー テーブル内にありません。たとえば、ユーザーの「ロール」を定義する一連の条件があります)。
次に、Global.asax の Application_BeginRequest メソッド内に次のものがあります。
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (null == authCookie)
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
{
return;
}
if (null == authTicket)
{
return;
}
string[] roles = authTicket.UserData.Split(new char[] { '|' });
FormsIdentity id = new FormsIdentity(authTicket);
GenericPrincipal principal = new GenericPrincipal(id, roles);
HttpContext.Current.User = principal;
基本的に、authticket からユーザーとの現在のコンテキストを設定します。ただし、MVC クラスのカスタム Authorize 属性を実行していたときに最初に問題に遭遇し、HTTPContext のユーザーが設定されていないことに気付きました。
次に、各アクション内で User も設定されていないことに気付きました。ただし、コードをステップ実行すると、ユーザーが認証チケット内で見つかり、復号化されてコンテキスト変数に格納されていることがはっきりとわかります。しかし、コントローラー内でアクションに到達するまでに、ユーザーはコンテキストから消えています。
EDIT : HTTPContext に設定された他の値がコントローラーに引き継がれることにも注意してください。たとえば、この行
HttpContext.Current.AllowAsyncDuringSyncStages = false; // Or true
私が設定したものは何でもコントローラーアクションに運びます。空白になるのはユーザーだけのようです。