在Live或本地提供程序上访问.NET成员身份

时间:2012-11-11 12:34:39

标签: c# asp.net asp.net-membership membership-provider

在我的web.config文件中,我有两个SQL Server连接字符串,一个用于本地,一个用于实时:

<connectionStrings>
    <remove name="LocalSqlServer" />
    <add name="LocalSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
    <add name="LiveSqlServer" connectionString="[removed]" providerName="System.Data.SqlClient"/>
</connectionStrings>

然后我有一个“utils”单例类,基本上设置连接字符串取决于我在“localhost”或我的实时服务器上运行网站:

if (Environment.MachineName.ToUpper() == MyOwnConfig.GetAppSettingsValue(ConfigKeys.localhost).ToUpper()) {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LocalAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LocalAspNetMemberSqlProvider"];
}
else {
    this.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["LiveSqlServer"].ToString();
    //MembershipProvider provider = Membership.Providers["LiveAspNetMemberSqlProvider"];
    //RoleProvider role = Roles.Providers["LiveAspNetMemberSqlProvider"];
}

我的数据库类只是使用了我的utils类的connectionString属性。所有这一切都很好,所以当我在本地放置网站时,我可以直接将其上传到实时,而无需更改配置文件中的连接字符串等,并开始使用我的实时数据库。

现在我正在将“成员资格”实施到我的网站中,而对于使用某些webmethods的ajax,我将providerUserKey存储在当前登录用户的文本字段中。然后我的web方法检查此密钥是否已通过身份验证。 e.g。

ajaxCreds.ajaxID1 = ((MembershipUser)Membership.GetUser()).ProviderUserKey.ToString();

问题: 我的问题是如何知道这个成员资格是来自LIVE数据库还是我的LOCAL数据库。正如您在Web配置中看到的那样,我已经在成员资格/提供程序行中添加了(注释掉了),但我不知道如何在上面的membership.getUser()命令中使用它们。

替代方案......这是一个好方法吗?或者上传到live时编辑web.config文件更简单吗?

非常感谢

2 个答案:

答案 0 :(得分:1)

大多数人都没有这样做,虽然我为你把这一切都弄清楚而鼓掌。通常,人们使用Deployment Manager或其他一些构建系统在服务器上使用与本地不同的web.config值。

以下是有关更改部署的链接:How do I use Web.Config transform on my connection strings?

答案 1 :(得分:1)

我建议你阅读这篇文章:

http://blogs.msdn.com/b/schlepticons/archive/2010/07/22/modifying-asp-net-providers-at-runtime.aspx

它会告诉你,其他人也试图做类似的事情。这就是如何取得成功。解决方案(如果调整)可能与您的需求类似。

  • 将所有提供者放入您的web.config
  • 在App_Start上调整哪个是默认值(基于环境)
  • Membership API将根据您的提供商密钥
  • 提供
  • 无需搜索名称提供商

注意:您必须调整void Application_Start(object sender, EventArgs e)实施,但想法是

注意2:您要做的事情肯定是不是例外。基于环境的配置非常智能!必须实现的是标准API使用,例如通过经理模式调用

  • System.Web.Security.Membership
  • System.Web.Security.Roles

而不是按名称调用提供商。