ASP.Net Core 应用程序中的会员提供程序

3

我正在强制将成员提供程序添加到ASP.Net Core应用程序中的问题。我必须添加它,因为它引用包含遗留代码和对System.Web.ApplicationServices程序集的引用的旧项目。在这个程序集中,流程会进入一行代码,该代码检查提供程序名称是否不为空。

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"
    ...
  }
}}

在启动类中,我以下列方式配置sqlMembershipProvider:
services.Configure<System.Web.Security.SqlMembershipProvider>(Configuration.GetSection("Membership"));

有人能告诉我,为什么我的提供者没有被实现到配置中呢?也许我走错了路线?


配置<>将IOption<>接口添加到DI中,并注入其他类。要初始化SqlMembershipProvider,您需要通过Add Transient、Scope或Singleton依赖项创建它,例如AddTransient<SqlMembershipProvider>()(我不知道该类的构造函数,但可能需要使用AddTransient(x=>new SqlMembershipProvider(...))手动初始化它)。或者您可以包装该类并将IOption<MembershipSettings>注入到构造函数中。 - Jaume
好的,我在我的服务中得到了一个 SQLMembershipProvider 实例,但是它的实现为空。我需要通过添加另一个变量来初始化它吗?例如:var abc = new SqlMembershipProvider(); abc.Initialize(); - Jakub Ostrowski
如果我是你,我会使用 .net core 的 app.config 文件来实现设置。 - AGuyCalledGerald
1个回答

1
你可以尝试像这样做:
首先,定义类来处理 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
    };
}

在Startup.cs文件中添加以下代码行:
services.Configure<MembershipSettings>(Configuration.GetSection("Membership"));
services.AddScoped<SqlMembershipProvider, CustomSqlMembershipProvider>();

最后但同样重要的是,稍微修改一下您的appsettings.json(您可以调整MembershiSettings类和CustomSqlMembershiProvider以处理和初始化提供程序列表)

"Membership": {
    "DefaultProvider": "blahblah",
    "Provider": {
        ...
        "Name": "blahblah"
        ...
    }
}

请注意,我对SqlMembershipProvider并不是很熟悉,所以可能存在一些缺陷。在我看来,你应该编写自己的MembershipProvider,但如果你无法这样做(因为遗留代码),那么你可以像上面那样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接