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")验证后立即为假,因为主体对象尚未附加到当前对象HttpContext

如果你真的想使用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);
    }
}

更新 - 使用登录控制验证用户

由于您使用的是 Membership Provider 和 Role Provider,我建议您使用 Login Control。

用户通过身份验证后,您可以使用 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 回答