使用MemberShip,Profile时碰上的一些问题
1. 使用Profile.GetProfile(string username)时碰上的问题
我想在一个页面里编辑任意一个MemberShip的User的Profile,这时我使用了页面.Profile.GetProfile(username),由于能登陆到这个页面的用户都是具有权限的用户,所以运行的时候一切正常,为了优化代码,我要把操作Profile的代码移动到后台自己定义的类里,这时候已经不存在页面类的实例,所以我要使用HttpContext.Current.Profile来代替Page.Profile 这时候问题出现了,在HttpContext.Current.Profile里不存在GetProfile(string username)这个方法,仔细看一下 原来这两个Profile是来之不同的类,Page.Profile是ProfileComm的实例,而HttpContext.Current.Profile是Profilebase的实例,最后找到得到GetProfile的方法是这样的:
ProfileCommon pc = (ProfileCommon)ProfileBase.Create(“username”, true);
而这里的username,一定是要一个通过认证的membership的user,这时候在使用pc.GetProfile(“otherusername”) 就可以对其他用户的Profile进行编辑了。
2. 使用MembershipUser.ChangePassword碰上的问题
我自定义了一个添加,修改,删除Membership用户的控件,要使用到修改密码的功能,MembershipUser里有一个ChangePassword的方法,不过需要两个参数,oldpassword和newpassword,由于我需要一个修改密码而不用提供旧密码的功能,所以就要先把用户的老密码给找出来,幸运的发现在MembershipUser下有一个GetPassword的方法,立即调用弹出异常,看了异常的说明继续找问题,发现问题出在 Membership Provider的配置参数上,
<membership defaultProvider="herSqlMembershipProvider">
<providers>
<add name="herSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" requiresQuestionAndAnswer="false" connectionStringName="her" requiresUniqueEmail="false" passwordFormat="Clear" minRequiredPasswordLength="3" enablePasswordRetrieval="true"
minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/ " />
</providers>
</membership>
GetPassword主要涉及到三个属性: passwordFormat, requiresQuestionAndAnswer, enablePasswordRetrieval,首先需要把enablePasswordRetrieval设置为true,可以回收密码,然后是passwordFormat可以设置三个值:Clear, Encrypted, and Hashed,如果设置成了Hashed,那密码是不可逆的,也不能得到密码,而Clear和Encrypted都是可以的,Clear是明文保存,而Encrypted是加密保存,如果设置成了加密保存,还需要设置一些密钥什么的,不然CreateUser时会出错,最后是属性requiresQuestionAndAnswer,它是表示是否需要有密码问题和答案来重新取回密码的机制,如果这个设置为true,那么你在使用GetPassword时,需要把这个用户的问题的答案一起传进去,不然也会产生异常。
3. 匿名访问时设置Profile属性出现异常
这也是需要配置文件里的属性进行配置:
<anonymousIdentification enabled="true" />
<profile defaultProvider="herSqlProfile">
<providers>
<add name="herSqlProfile" type="System.Web.Profile.SqlProfileProvider" connectionStringName="her" />
</providers>
<properties>
<add name="MyTheme" type="String" allowAnonymous="true"/>
</properties>
</profile>
首先是anonymousIdentification 把enbaled设置为true,然后再profile里的属性allowAnonymous="true"
路漫漫其修远兮 吾将上下而求索
my blog