【问题标题】:Membership provider in ASP.Net Core appASP.Net Core 应用程序中的成员资格提供程序
【发布时间】:2018-07-31 15:09:38
【问题描述】:

我正在执行将成员资格提供程序添加到 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"));

谁能告诉我,为什么我没有在配置中实现我的提供程序?也许我走错路了?

【问题讨论】:

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

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


【解决方案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,但如果您不能(因为遗留代码),那么您可以执行上述操作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多