2

私は.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>
4

2 に答える 2

2

これは行わないでください...新しい認証チケットが作成されるためです。

FormsAuthentication.SetAuthCookie();

代わりに、Cookieを明示的に設定してください

var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = authTicket.Expiration;
Request.Cookies.Add(cookie);

その後、global.asaxで利用できるようになります

var userData = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket.UserData;
于 2012-10-03T04:16:58.220 に答える
0

変更してみる

string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
FormsAuthentication.SetAuthCookie(encryptedTicket, true);

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));
Response.Cookies.Add(cookie);

FormsAuthentication.SetAuthCookieはすでに内部的に呼び出していると思わFormsAuthentication.Encryptれるため、おそらく不正な形式の Cookie が作成されている可能性があります。

于 2014-05-04T21:44:28.570 に答える