私は.NETに比較的慣れていないため、FormsAuthenticationを理解しようとしています。私はいくつかの異なるチュートリアルを経験しましたが、毎回同じ問題に遭遇しました。何らかの理由で、UserData がチケットに保存されていません。Global.aspx.cs のチケットにブレークを設定すると、UserName は存在しますが、UserData は空の文字列であり、Version が 1 として指定されている場合は 2 に設定されます。別の奇妙な点は、すべての認証済みユーザーが許可されることです。 web.config で管理者のみがアクセスできるように指定されている場合に、私の Admin_Content フォルダー内のページにアクセスするには。
ログイン.aspx
UserFull user = ManageUsers.login(loginTemplate.UserName, loginTemplate.Password);
if (user != null)
{
string[] roles = { user.role };
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
userName,
DateTime.Now,
DateTime.Now.AddDays(30),
true,
roles[0],
FormsAuthentication.FormsCookiePath
);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
FormsAuthentication.SetAuthCookie(encryptedTicket, true);
Response.Redirect("Admin_Content/Admin.aspx");
}
Global.aspx.cs Application_AuthenticateRequest
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = (id.Ticket);
if (!string.IsNullOrEmpty(ticket.UserData))
{
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id, roles);
}
}
}
}
メイン web.config
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<roleManager enabled="true"></roleManager>
<authentication mode="Forms">
<forms name="AOTMP_Demo" loginUrl="Login.aspx"
protection="All" path="/" cookieless="UseCookies"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
<configuration>
Admin_Content フォルダーの web.config
<configuration>
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="?"/>
</authorization>
</system.web>
</configuration>