C# ASP.Net核心应用程序中的成员资格提供程序

C# ASP.Net核心应用程序中的成员资格提供程序,c#,asp.net-core,asp.net-membership,C#,Asp.net Core,Asp.net Membership,我正在强制解决将成员资格提供程序添加到ASP.Net核心应用程序的配置中的问题。我必须添加它,因为它引用了包含遗留代码的旧项目,并引用了System.Web.ApplicationServices的程序集。在这个程序集中,流转到第行,该行检查提供者的名称是否为null if ( providerName == null || SystemWebProxy.Membership.Providers[providerName] == null ) { thro

我正在强制解决将成员资格提供程序添加到ASP.Net核心应用程序的配置中的问题。我必须添加它,因为它引用了包含遗留代码的旧项目,并引用了
System.Web.ApplicationServices
的程序集。在这个程序集中,流转到第行,该行检查提供者的名称是否为null

if ( providerName == null || SystemWebProxy.Membership.Providers[providerName] == null )
        {
            throw new ArgumentException(String.Format(CultureInfo.CurrentCulture, ApplicationServicesStrings.Membership_provider_name_invalid), "providerName" );
        }
但无论如何,我在
appsettings.json中添加了必要的实现:

"Membership": {
"DefaultProvider": "blahblah",
"Providers": {
  "Add": {
    ...
    "Name": "blahblah"
    ...
  }
}}
在startup类中,我以以下方式配置
sqlMembershipProvider

services.Configure<System.Web.Security.SqlMembershipProvider>(Configuration.GetSection("Membership"));
services.Configure(Configuration.GetSection(“成员”);

有人能告诉我,为什么我没有在配置中实现我的提供者?也许我走错方向了?

你可以试试这样的方法:

首先,定义类来处理appsettings.json

public class MembershipSettings{
    public string DefaultProvider { get; set; }
    public Provider Provider { get; set; }
}

public class Provider
{
    public string Name { get; set; }
    public string ConnectionStringName { get; set; } //not sure if it works
    public string ApplicationName { get; set; }
    //etc
}
然后从SqlMembershipProvider继承

internal class CustomeSqlMembershipProvider : SqlMembershipProvider
{
    public CustomeSqlMembershipProvider(IOptions<MembershipSettings> settings)
    {
        InitializeProvider(settings.Value);
    }

    protected virtual void InitializeProvider(MembershipSettings settings)
    {
        base.Initialize(settings.Provider.Name, PrepareSettings(settings.Provider));
    }

    private NameValueCollection PrepareSettings(Provider provider) => new NameValueCollection
    {
        //you can use reflection to do that as well

        { nameof(provider.ApplicationName), provider.ApplicationName},
        {nameof(provider.ConnectionStringName), provider.ConnectionStringName}

        //...
        //etc
    };
}

请注意,我对SqlMembershipProvider不太熟悉,因此可能存在一些缺陷。在我看来,您应该编写自己的MembershipProvider,但如果您不能(因为遗留代码),那么您可以执行上述操作

Configure将IOption接口添加到DI,DI将被注入到其他类中。要初始化SqlMembershipProvider,您需要通过添加Transient、Scope或Singleton依赖项来创建它,例如AddTransient()(我不知道该类的构造函数,但您可能需要使用AddTransient手动初始化它(x=>new SqlMembershipProvider(…)。或者您可以包装该类并将IOption注入构造函数。如果我在服务中获得SQLMembershipProvider的实例,但实现为空。是否需要通过添加另一个变量来初始化它,例如:
var abc=new SQLMembershipProvider();abc.Initialize();
?如果我是你,我会使用.net core app.config文件来实现设置
services.Configure<MembershipSettings>(Configuration.GetSection("Membership"));
services.AddScoped<SqlMembershipProvider, CustomSqlMembershipProvider>();
"Membership": {
    "DefaultProvider": "blahblah",
    "Provider": {
        ...
        "Name": "blahblah"
        ...
    }
}