在自定义控件中使用ASP.NET成员资格提供程序的字符串资源

时间:2010-03-15 11:34:56

标签: .net asp.net asp.net-membership

我有要求为ASP.NET成员资格构建自定义控件。该控件是一种CreateUserWizard,但有点特殊。用户由我们的客户经理创建。用户首次登录时输入用户名和初始密码,更改密码并在一次交易中输入附加信息(电子邮件)!

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

1 个答案:

答案 0 :(得分:1)

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

此外,大多数默认控件允许您使用Template elementsadding additional steps to the create user wizard添加或替换控件(例如填充个人资料信息) - 您是否能够提供有关的任何其他信息?你想做什么?

回复评论/问题更新

我对此有一些进一步的想法,一些围绕你需要涵盖的思考,一些关于潜在的实施。

一旦用户由客户经理创建,并且他们被告知他们的用户名和临时密码一些(电话/电子邮件/其他),他们在哪里登录?您是主站点登录控件,还是您乐意将它们引导到自定义登录页面?

考虑到这一点,并且取决于您在网站上拥有的登录控件的数量(即,您只有一个用户可以登录的位置,或者您有多个页面),您可能想要实现部分或全部以下内容:

  1. 继承自SqlMembershipProvider的custom membership provider(不是MembershipProvider,它是抽象的,因此需要更多工作),并且只覆盖ValidateUserChangePassword,将所有其他方法传递回基本默认。
  2. 用于捕获现有详细信息,电子邮件地址和新密码详细信息的自定义控件。
  3. 用于捕获主登录控件的Authenticate事件的事件处理程序。
  4. 您可能希望使用自定义成员资格提供程序的原因是它可以让您利用基本提供程序的Approved用户概念等问题 - 开箱即用的问题{{1在尝试验证用户是否未获批准时,它会返回SqlMebershipProvider,这使得很难区分不正确的密码和自定义控件中的“未批准”用户。

    如果您创建自定义控件并拥有上面讨论的自定义成员资格提供程序,则可以将新用户定向到托管该控件的页面,这将确保他们提交所有其他详细信息,当他们提交您要执行的页面时以下内容:

    • 使用帐户主管创建的详细信息调用false(在您的自定义成员资格提供程序上)。
    • 如果返回true,则使用用户,旧密码和新密码调用ValidateUser
    • 致电提供商处的ChangePassword以获取GetUser,将其电子邮件地址和“IsApproved”状态更新为true,并将MembershipUser对象传递到MembershipUser方法。
    • 调用UpdateUser为用户设置Cookie,以告知后续请求用户已通过身份验证。
    • 将用户重定向到合理的页面。

    如果前两个中的任何一个返回false,则可以使用合理的消息进行响应 - 如果ValidateUser失败,则先前提供的详细信息是错误的,如果ChangePassword失败,则新密码不符合在长度,强度等的提供者配置

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

    FormsAuthentication.SetAuthCookie

    你会打电话:

    // 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"]; 方法的输出参数类型为MembershipCreateStatus,其值包含CreateUserSuccessInvalidUserName,{ {1}},这有助于将合理的消息返回给客户经理。