【问题标题】:Using the string resources of ASP.NET membership provider in a custom control在自定义控件中使用 ASP.NET 成员资格提供程序的字符串资源
【发布时间】:2010-03-15 11:34:55
【问题描述】:

我有为 ASP.NET 成员构建自定义控件的请求。该控件是一种 CreateUserWizard,但有些特殊。用户由我们的客户主管创建。用户第一次登录时输入他们的用户名和初始密码,更改密码并在一次交易中输入其他信息(电子邮件)!

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

【问题讨论】:

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


    【解决方案1】:

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

    此外,大多数默认控件允许您使用Template elements 或通过adding additional steps to the create user wizard 添加或替换控件(例如填充配置文件信息) - 您能否提供有关您正在尝试的内容的任何其他信息怎么办?

    回复评论/问题更新

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

    一旦客户主管创建了用户,并以某种方式(电话/电子邮件/其他方式)告知他们用户名和临时密码,他们应该去哪里登录?您是主站点登录控件,还是乐于将它们引导到自定义登录页面?

    深思熟虑后,根据您在网站上拥有的登录控件的数量(即您是只有一个用户可以登录的地方,还是有多个页面),您可能希望实现部分或全部以下:

    1. 从 SqlMembershipProvider 继承的 custom membership provider(不是 MembershipProvider,它是抽象的,因此需要更多工作),并且仅真正覆盖 ValidateUserChangePassword,将所有其他方法传递回基本默认值。李>
    2. 用于捕获现有详细信息、电子邮件地址和新密码详细信息的自定义控件。
    3. 用于捕获主登录控件的Authenticate 事件的事件处理程序。

    您可能想要使用自定义成员资格提供程序的原因是,它使您能够利用基本提供程序的 Approved 用户概念之类的东西 - 开箱即用 SqlMebershipProvider 的问题在于如果用户未获得批准,它将在尝试验证用户时返回 false,这使得在您的自定义控件中很难区分错误密码和“未批准”用户。

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

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

    如果前两个中的任何一个返回 false,您就可以返回一条合理的消息 - 如果 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 类型的输出参数,它的值例如SuccessInvalidUserNameInvalidPasswordDuplicateUserName,应该有助于返回合理的消息回到客户经理那里。

    【讨论】:

    • 感谢您对我的问题非常详细和熟练的想法。您描述的架构在许多细节上与我现有的架构相匹配。我已经使用了从 SqlMembershipProvider 继承的自定义成员资格提供程序,我的问题是关于您描述的“用于捕获现有详细信息的自定义控件”。对我来说,新的想法是将已批准用户的概念集成到会员提供者中。我想我会朝着这个方向重新设计我的架构。
    • 很高兴为您提供帮助 - 如果您需要更多详细信息等,请告诉我 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多