最近公司写一个项目,用的是微软自带的登陆控件和数据库,在这其中需要用到一些东西,比如Context.User.IsInRole()方法总是返回false的问题,还有就是用户忘记密码,重置密码的问题。
1. Context.User.IsInRole()
这个方法需要在配置文件中配置一下
<membership>
<providers>
<clear/>
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="DBConnStr" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/"/>
</providers>
</membership>
<profile>
<providers>
<clear/>
<add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
</providers>
</profile>
<roleManager enabled="true">
<providers>
<clear/>
<add name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DBConnStr" applicationName="/"/>
<add name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider" applicationName="/"/>
</providers>
</roleManager>
这样就应该行了。当让数据库中的对应的权限表要录入数据
如果是自己写的登陆,数据库也没有用微软自带的数据库,也想要用Context.User那么就用如下的代码(这是我想出来的一种方法)
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// 登录的时候就这样写
MyUser myUser = new MyUser() { UserName = "11", PassWord = "111", Role = "admin" };
Context.User = myUser;
Response.Write(Context.User.IsInRole("admin") + " 用户的名字是:" + Context.User.Identity.Name);
}
}
public class MyUser : System.Security.Principal.IPrincipal
{
public string UserName { get; set; }
public string PassWord { get; set; }
public string Role { get; set; }
public System.Security.Principal.IIdentity Identity
{
get { return new MyIdentity(UserName); }
}
public bool IsInRole(string role)
{
if (role == Role) return true;
else return false;
}
}
public class MyIdentity : System.Security.Principal.IIdentity
{
string name;
public MyIdentity(string userName)
{
name = userName;
}
public string AuthenticationType
{
get { return null; }
}
public bool IsAuthenticated
{
get { return false; }
}
public string Name
{
get
{
return name;
}
}
}
这样就可以用Context.User中的属性和IsInRole方法了
2.关于重置密码的问题
微软有个自带的密码重置功能,有2中方法,一种是需要提供用户原来的密码,一种是不需要的,
1.如果有原来用户的密码,那么就可以ChangePassword就行了,
2.如果不知道密码但知道密码问题,可以MembershipUser.ResetPassword(string passwordAnswer)
3.如果不知道密码也不知道密码问题,可以参照 http://yimingzhi.net/2007/06/5267386a-5a0a-43c4-abf3-160249e7a1d7博客
但是当时我嫌那个方法太麻烦,所以就用了下面的方法
MembershipUser u = Membership.GetUser(userName);
bool lockUser = u.UnlockUser();
string s = u.ResetPassword();
u.ChangePassword(s, "123123");
这个方法也实现了重置密码的功能,主要是这句 bool lockUser = u.UnlockUser(); 起了关键性的作用,但是不知道有没有什么危害