【问题标题】:Why is ASP.NET ignoring my Membership connection string?为什么 ASP.NET 会忽略我的 Membership 连接字符串?
【发布时间】:2010-02-19 01:54:33
【问题描述】:

我有一个使用内置会员功能的 ASP.NET 应用程序。因此,我的 web.config 中有一个连接字符串,如下所示:

<add name="MembershipSqlServer" connectionString="Data Source=servername;Database=aspnetdb;uid=user;pwd=password;" />

在我的开发机器上工作时,一切都很好。但是,当我将内容移动到 Web 服务器(也恰好运行 SQL Server)时,在调用 User.IsInRole() 时出现此错误:

System.Data.SqlClient.SqlException:用户“NT AUTHORITY\NETWORK SERVICE”登录失败。

F$%*&!!为什么它试图以这种方式连接?为什么不使用连接字符串中的用户/密码? Web.config 在开发和服务器上是相同的,我在开发过程中使用服务器上的数据库。

【问题讨论】:

  • 发布您的 web.config。看起来您正在从链中某处的 machine.config 中提取某些内容。

标签: asp.net sql-server sql-server-2005 asp.net-membership


【解决方案1】:

好的,我想通了……只有 35 分钟。 :P

长话短说:asp.net 会员资格分为两部分……会员资格提供者和角色提供者。为什么你会想要将这两个东西分开,我不知道……但是我的 web.config 没有指定 role 提供程序和连接字符串,所以它默认为机器中的设置。 config(又名 LocalSqlServer 连接字符串)。

所以一直以来,我的应用程序用户都在服务器上...但角色存储在 App_Data 中的本地 .MDF 文件中。呃。

【讨论】:

    【解决方案2】:

    您的 web.config 中的成员资格提供程序部分是什么样的?您是否有可能遗漏了 connectionStringName 属性?在这种情况下,我相信它会尝试使用集成安全性连接到您本地计算机上的数据库。

    您的 web.config 中的成员资格提供程序部分应如下所示:

    <membership defaultProvider="SqlProvider">
      <providers>
        <add 
          name="SqlProvider" 
          type="System.Web.Security.SqlMembershipProvider" 
          connectionStringName="MembershipSqlServer"
          ...
        />
      </providers>
    </membership>
    

    【讨论】:

    • 谢谢约翰...非常接近。 :) 我基本上没有意识到我还需要为 部分指定相同的信息。
    【解决方案3】:

    你在你的 web.config 中看到了这个&lt;authentication mode="Windows" /&gt; 吗?而您的其他 connectionString 使用 Integrated Security=True;在您的 Sql 服务器上,为了使用 windows 身份验证,您必须拥有 windows 用户或组的登录名(在服务器上),并且在数据库中有关联的用户。

    简单但不建议的解决方法是为“NT AUTHORITY\NETWORK SERVICE”创建一个登录名 在您的 sql server 上,然后在您的特定数据库中映射到该登录名的用户。 安全的方法是对每个需要访问 sql server 的网络安全组执行此操作,以便您可以独立管理组权限。

    【讨论】:

      【解决方案4】:

      我认为答案是:

       public static string ConnectionString(SPSite site)
              {
                  var connectionStringField = BaseMembershipProvider(site).GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);
                  if (connectionStringField != null)
                  {
                      return connectionStringField.GetValue(BaseMembershipProvider(site)).ToString();
                  }
                  else
                  {
                      return "";
                  }
              }
      

      它对我有用,没有任何错误

      感谢巴巴尼亚

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-23
        • 2020-11-15
        相关资源
        最近更新 更多