C# 从windows应用程序管理asp.net网站(创建新用户、将用户分配到角色等)

C# 从windows应用程序管理asp.net网站(创建新用户、将用户分配到角色等),c#,.net,asp.net,vb.net,winforms,C#,.net,Asp.net,Vb.net,Winforms,我有一个使用基于表单的身份验证的asp.net web应用程序、一个SqlMembershipProvider(使用加密密码格式)和一个SqlRoleProvider。我需要知道是否有可能从windows应用程序管理用户(创建新用户,将他们分配到角色等)——超级用户不希望web应用程序本身具有任何管理功能 以下是web.config中的成员资格提供程序定义: <membership defaultProvider="MyProvider"> <providers>

我有一个使用基于表单的身份验证的asp.net web应用程序、一个SqlMembershipProvider(使用加密密码格式)和一个SqlRoleProvider。我需要知道是否有可能从windows应用程序管理用户(创建新用户,将他们分配到角色等)——超级用户不希望web应用程序本身具有任何管理功能

以下是web.config中的成员资格提供程序定义:

<membership defaultProvider="MyProvider">
  <providers>
    <add name="MyProvider"
         type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         connectionStringName="MyConnectionString"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="true"
         applicationName="/MyWebApp"
         requiresUniqueEmail="true"
         passwordFormat="Encrypted"
         maxInvalidPasswordAttempts="5"
         minRequiredPasswordLength="7"
         minRequiredNonalphanumericCharacters="1"
         passwordAttemptWindow="10"
         passwordStrengthRegularExpression=""/>
  </providers>
</membership>

以及角色管理器定义:

<roleManager enabled="true" defaultProvider="MyRoleManager">
  <providers>
    <add name="MyRoleManager"
         type="System.Web.Security.SqlRoleProvider"
         connectionStringName="MyConnectionString"
         applicationName="/MyWebApp" />
  </providers>
</roleManager>

以下是machineKey定义(能够使用加密密码所必需的):


显然,我有一个Sql Server数据库,其中包含web应用程序的用户和角色。我想创建一个引用web应用程序集的单独windows应用程序,并使用配置的MembershipProvider、RoleProvider和machineKey创建用户、将用户分配到角色等。如果不可能,我可以在windows应用程序内从web.config复制配置设置。但我也不知道怎么做

我认为这是可能的,这是不是太离谱了?我尝试过用谷歌搜索解决方案,但信噪比非常差。

我不确定这里的“最佳实践”是什么,但一个简单的方法应该是这样

  • 创建新的windows应用程序
  • 添加一个应用程序配置文件 (app.config)
  • 将适当的设置复制到 app.config(上面的设置 ^)
  • 添加对System.Web的引用
  • 并从您的web应用程序复制代码 使用上述设置 连接到数据库
这应该可以满足您的需要。

我不确定这里的“最佳实践”是什么,但一个简单的方法应该是这样的

  • 创建新的windows应用程序
  • 添加一个应用程序配置文件 (app.config)
  • 将适当的设置复制到 app.config(上面的设置 ^)
  • 添加对System.Web的引用
  • 并从您的web应用程序复制代码 使用上述设置 连接到数据库
这应该可以满足您的需要。

一些选项:

  • 你可以用这个,但不是 基于Windows窗体,但不是其中的一部分 您的Web应用程序的。它来了 使用Visual Studio并可以 通过单击ASP.NET访问 解决方案中的配置图标 探险家
  • 直接操纵是可能的 服务器使用的提供程序数据库 来自Windows的SqlMembershipProvider 表单应用程序,但您可能必须 小心不要弄坏东西
  • 如果要创建自定义 会员资格提供者,你会在 如何控制成员资格和角色 数据被持久化。如果你那样做了 您可以创建一个可重用的库 可用于Web应用程序和 还有一个Windows窗体应用程序
我不认为尝试从Windows窗体应用程序中使用SqlMembershipProvider是一种实用的方法。

一些选项:

  • 你可以用这个,但不是 基于Windows窗体,但不是其中的一部分 您的Web应用程序的。它来了 使用Visual Studio并可以 通过单击ASP.NET访问 解决方案中的配置图标 探险家
  • 直接操纵是可能的 服务器使用的提供程序数据库 来自Windows的SqlMembershipProvider 表单应用程序,但您可能必须 小心不要弄坏东西
  • 如果要创建自定义 会员资格提供者,你会在 如何控制成员资格和角色 数据被持久化。如果你那样做了 您可以创建一个可重用的库 可用于Web应用程序和 还有一个Windows窗体应用程序

我不认为尝试从Windows窗体应用程序中使用SqlMembershipProvider是一种实用的方法。

我根据其他答案(他们都得到+1)提出了一个解决方案

首先,我创建了应用程序配置文件(app.Config)。它准确地反映了web应用程序在web.config中找到的内容,但连接字符串的处理方式除外:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="connectionStrings" type="System.Configuration.ConnectionStringsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" requirePermission="false" />
  </configSections>

  <connectionStrings>
    <add name="MyConnectionString"
         connectionString ="SERVER=abc;UID=def;PWD=hij;Initial Catalog=klm;MultipleActiveResultsets=True"/>
  </connectionStrings>

  <system.web>

    <membership defaultProvider="MySqlMembershipProvider">
      <providers>
        <add name="MySqlMembershipProvider"
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="MyConnectionString"
             enablePasswordRetrieval="false"
             enablePasswordReset="true"
             requiresQuestionAndAnswer="true"
             applicationName="/MyWebApp"
             requiresUniqueEmail="true"
             passwordFormat="Encrypted"
             maxInvalidPasswordAttempts="5"
             minRequiredPasswordLength="7"
             minRequiredNonalphanumericCharacters="1"
             passwordAttemptWindow="10"
             passwordStrengthRegularExpression=""/>
      </providers>
    </membership>

    <roleManager enabled="true" defaultProvider="MySqlRoleManager">
      <providers>
        <add name="MySqlRoleManager"
             type="System.Web.Security.SqlRoleProvider"
             connectionStringName="MyConnectionString"
             applicationName="/MyWebApp" />
      </providers>
    </roleManager>

    <machineKey
      validationKey="BC50A82A6AF6A015C34C7946D29B817C00F04D2AB10BC2128D1E2433D0E365E426E57337CECAE9A0681A2C736B9779B42F75D60F09F142C60E9E0E8F9840DB46"
      decryptionKey="122035576C5476DCD8F3611954C837CDA5FE33BCDBBF23F7"
      validation="SHA1"
      decryption="AES"/>
  </system.web>

</configuration>
此时,只需访问
提供者
类的
成员身份
角色
属性。例如,下面打印出前10个用户及其角色:

int total;
foreach (MembershipUser user in Provider.Membership.GetAllUsers(0, 10, out total))
{
    var sb = new StringBuilder();
    sb.AppendLine(user.UserName);
    foreach (var role in Provider.Role.GetRolesForUser(user.UserName))
    {
        sb.AppendLine("\t" + role);
    }

    Console.WriteLine(sb.ToString());
}

我根据其他答案(他们都得到+1)提出了一个解决方案,并且

首先,我创建了应用程序配置文件(app.Config)。它准确地反映了web应用程序在web.config中找到的内容,但连接字符串的处理方式除外:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <configSections>
    <section name="connectionStrings" type="System.Configuration.ConnectionStringsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" requirePermission="false" />
  </configSections>

  <connectionStrings>
    <add name="MyConnectionString"
         connectionString ="SERVER=abc;UID=def;PWD=hij;Initial Catalog=klm;MultipleActiveResultsets=True"/>
  </connectionStrings>

  <system.web>

    <membership defaultProvider="MySqlMembershipProvider">
      <providers>
        <add name="MySqlMembershipProvider"
             type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
             connectionStringName="MyConnectionString"
             enablePasswordRetrieval="false"
             enablePasswordReset="true"
             requiresQuestionAndAnswer="true"
             applicationName="/MyWebApp"
             requiresUniqueEmail="true"
             passwordFormat="Encrypted"
             maxInvalidPasswordAttempts="5"
             minRequiredPasswordLength="7"
             minRequiredNonalphanumericCharacters="1"
             passwordAttemptWindow="10"
             passwordStrengthRegularExpression=""/>
      </providers>
    </membership>

    <roleManager enabled="true" defaultProvider="MySqlRoleManager">
      <providers>
        <add name="MySqlRoleManager"
             type="System.Web.Security.SqlRoleProvider"
             connectionStringName="MyConnectionString"
             applicationName="/MyWebApp" />
      </providers>
    </roleManager>

    <machineKey
      validationKey="BC50A82A6AF6A015C34C7946D29B817C00F04D2AB10BC2128D1E2433D0E365E426E57337CECAE9A0681A2C736B9779B42F75D60F09F142C60E9E0E8F9840DB46"
      decryptionKey="122035576C5476DCD8F3611954C837CDA5FE33BCDBBF23F7"
      validation="SHA1"
      decryption="AES"/>
  </system.web>

</configuration>
此时,只需访问
提供者
类的
成员身份
角色
属性。例如,下面打印出前10个用户及其角色:

int total;
foreach (MembershipUser user in Provider.Membership.GetAllUsers(0, 10, out total))
{
    var sb = new StringBuilder();
    sb.AppendLine(user.UserName);
    foreach (var role in Provider.Role.GetRolesForUser(user.UserName))
    {
        sb.AppendLine("\t" + role);
    }

    Console.WriteLine(sb.ToString());
}

我可以实例化一个SqlMembershipProvider和一个SqlRoleProvider,并设置几乎所有必要的属性,但如何给它们一个连接字符串呢?我如何向SqlMembershipProvider提供验证和解密密钥?根据,没有设置SqlMembershipProvider连接字符串的属性或方法。您应该能够以与在web应用中相同的方式完成所有这些操作。我假设您在web应用程序中使用类似的代码供用户登录?在web应用程序中,初始化都是自动完成的。您永远不必手动调用
SqlMembershipProvider
Initialize
方法。另外,我使用的是登录控件,所以我甚至从未接触过
SqlMembershipProvider
。我可以实例化SqlMembershipProvider和SqlRoleProvider,并设置几乎所有必要的属性,但如何给它们一个连接字符串?我如何向SqlMembershipProvider提供验证和解密密钥?根据,没有设置SqlMembershipProvider连接字符串的属性或方法。您应该能够以与在web应用中相同的方式完成所有这些操作。我想