2010-03-15 136 views
1

我有建立ASP.NET成员资格自定义控件的请求。该控件是一种CreateUserWizard,但有点特别。用户由我们的客户经理创建。在第一次登录时,用户输入他们的用户名和初始密码,在一次交易中更改密码并输入附加信息(电子邮件)!在自定义控件中使用ASP.NET成员资格提供程序的字符串资源

通过自定义CreateUserWizard或其他内置控件来构建这个看起来是错误的。我想通过使用内置控件的字符串资源来构建自定义控件。有没有办法只访问ASP.NET成员资源?他们是公共可访问的资源管理器或类似的东西吗?

回答

1

MembershipProvider模型exposes all the properties(更新后的链接)可通过web.config进行配置,因此,一旦掌握了正确提供程序的实例,您应该能够阅读这些属性 - 您无法读?

此外,大多数默认控件允许您使用Template elementsadding additional steps to the create user wizard(例如填充配置文件信息)来添加或替换控件 - 是否可以提供有关正在尝试执行的任何其他信息?

回应评论/问题更新

我有一些有关此的进一步思考,周围的一些思考就需要有覆盖,以及一些关于潜在的实施。

一旦用户由帐户主管创建,他们被告知他们的用户名和临时密码一些如何(电话/电子邮件/无论),他们去哪里登录?是您的主站点登录控制,还是您很乐意将他们引导到自定义登录页面?

考虑到这一点,根据您在网站上登录控件的数量(即,您是否只有一个用户可以登录的位置,或者您是否有多个页面),您可能需要实现部分或全部以下内容:

  1. 一个custom membership provider从SqlMembershipProvider的继承(没有的MembershipProvider,这是抽象的,所以需要更多的工作),只有真正覆盖ValidateUserChangePassword,通过所有其他方法回落到基本默认。
  2. 用于捕获现有详细信息,电子邮件地址和新密码详细信息的自定义控件。
  3. 捕获主登录控件的Authenticate事件的事件处理函数。

你可能想使用自定义的成员提供的原因是,它将使你拿的东西像一个Approved用户的基础供应商的概念优势 - 与开箱SqlMebershipProvider的问题是,它在尝试验证用户是否被批准时将返回false,这使得很难区分不正确的密码和自定义控件中的“未批准”用户。

如果您创建了一个自定义控件并拥有上面讨论的自定义成员资格提供程序,那么您可以将新用户引导至托管该控件的页面,这将确保他们提供所有额外的详细信息,请执行以下操作:

  • 拨打电话ValidateUser(在您的自定义会员供应商处)提供由客户经理创建的详细信息。
  • 如果返回true,则用用户,旧密码和新密码呼叫ChangePassword
  • 致电GetUser在您的提供商得到MembershipUser,更新他们的电子邮件地址和“IsApproved”状态为真,并将MembershipUser对象传入UpdateUser方法。
  • 拨打FormsAuthentication.SetAuthCookie设置用户的cookie,告诉用户通过身份验证的后续请求。
  • 将用户重定向到合理的页面。

如果任前两回假,然后你可以回应背部采用了合理的信息 - 如果的ValidateUser失败,那么先前提供的信息有误,如果ChangePassword失败那么新的密码不符合要求在长度,强度等提供商配置中定义。

您可能还想挂钩主登录表单的Authenticate事件,因为您需要手动检查用户是否已批准,如果不取消登录事件。解决这个问题的方法(特别是如果你扩展SqlMembershipProvider)是配置开箱即用的SqlMembershipProvider和你的自定义提供程序,将SqlMembershipProvider设置为默认值,然后在你的自定义控件中,而不是调用:

// Gets the "Default" provider configured in the web.config 
MembershipProvider provider = Membership.Provider; 

你会打电话:

// Pass the name of your provider into the Providers collection 
// Rather than hardcoding this, pass it in as a required parameter 
MembershipProvider provider = Membership.Providers["MyMembershipProvider"]; 

您可以用同样的方法来获取已配置的提供者的各种性能,如强度,长度等

请牢记那CreateUser方法具有类型为MembershipCreateStatus的输出参数,其值为Success,InvalidUserName,InvalidPassword,DuplicateUserName,这应该有助于将合理的消息返还给客户主管。

+0

非常感谢您对我的问题提出的非常详细和有技巧的想法。您所描述的架构在很多细节上与我现有的架构相匹配。我已经使用了从SqlMembershipProvider继承的自定义成员资格提供程序,我的问题是关于您描述的“自定义控件捕获现有细节”。对我而言,新兴想法是将认可用户的概念集成到成员资格提供者中。我想我会在这个方向上重建我的架构。 – 2010-03-21 14:44:11

+0

很高兴帮助 - 如果你需要更多的细节等,让我知道:) – 2010-03-21 20:22:05

相关问题