1

ユーザーがユーザー名とパスワードを入力する次のログインページがあります。

その情報を使用して、それらが Admin1 ロールの一部であることを確認する必要があります。そうであれば、ユーザーのマシンに Cookie を設定したいと思います。

User.InRole の下にあるコードでは、if ステートメントに入りません。FormsAuthentication.SetAuthCookie(txtUserName.Text, true); のコメントを外すと、上で動作します。ユーザーが Admin1 ロールの一部である場合にのみ、Cookie を設定すべきではありません。

私は以下を持っていますが、動作していないようです:

    if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text))
    {

     //   FormsAuthentication.SetAuthCookie(txtUserName.Text, true);

        if (User.IsInRole("Admin1"))
        {
            // code never reaches here 
            FormsAuthentication.SetAuthCookie(txtUserName.Text, true);
4

1 に答える 1

3

User.IsInRole("Admin1")プリンシパル オブジェクトがまだ現在のオブジェクトにアタッチされていないため、検証直後は falseHttpContextです。

本当に を使用したい場合はContext.User、プリンシパル オブジェクトを手動でアタッチする必要があります。

var username = txtUserName.Text;
var password = txtPassword.Text;

if (Membership.ValidateUser(username , password))
{
    var roles = Roles.GetRolesForUser(username);
    var identity = new GenericIdentity(username);
    var principal = new GenericPrincipal(identity, roles);
    Context.User = principal;

    // Now you can use Context.User

    // Basically User.IsInRole("Admin1") is same as roles.Contains("Admin1")
    if (User.IsInRole("Admin1"))
    {
        FormsAuthentication.SetAuthCookie(username, true);
    }
}

更新 - ログイン制御を使用してユーザーを認証する

メンバーシップ プロバイダーとロール プロバイダーを使用しているため、ログイン コントロールを使用することをお勧めします。

ユーザーが認証されると、LoggedIn イベントを使用してユーザーを適切なページにリダイレクトできます。

<asp:Login ID="LoginUser" runat="server" EnableViewState="false" 
   RenderOuterTable="false" OnLoggedIn="LoginUser_LoggedIn">
   ...
</asp:Login>

protected void LoginUser_LoggedIn(object sender, EventArgs e)
{
   // Now we know that user is authenticated
   // Membership user = Membership.GetUser(Login1.Username);
   var roles = Roles.GetRolesForUser(Login1.Username);

   if(roles.Contains("Admin1"))
      Response.Redirect("~/Admin/");
   else
      Response.Redirect("~/Users/");       
}
于 2013-04-30T15:29:42.660 に答える