0

为了更好地了解如何在 .net MVC4 应用程序中连接身份验证功能,我想我会拆开“Internet 应用程序”模板生成的网站。最终,我正在研究如何实现声称知道的东西(例如:https ://github.com/brockallen/BrockAllen.MembershipReboot )

作为其中的一部分,我发现自己正在查看包含以下代码的方法 WebMatrix.WebData.WebSecurity.PreAppStartInit():

 const string BuiltInMembershipProviderName = "AspNetSqlMembershipProvider";
    var builtInMembership = Membership.Providers[BuiltInMembershipProviderName];
    if (builtInMembership != null)
    {
        var simpleMembership = CreateDefaultSimpleMembershipProvider(BuiltInMembershipProviderName, currentDefault: builtInMembership);
        Membership.Providers.Remove(BuiltInMembershipProviderName);
        Membership.Providers.Add(simpleMembership);
    }

如果我尝试在控制台应用程序中运行类似的东西,它会在 Membership.Providers.Remove(BuiltInMembershipProviderName);调用点抛出 System.NotSupportedException。如果集合已经SetReadOnly调用了它的方法,这是可以预料的,但它没有。我不确定为什么在控制台应用程序代码中会发生这种情况,而不是在 Web 应用程序中。有人有想法么?

4

1 回答 1

0

这也让我困惑了一段时间。诀窍是这个初始化的时间。它需要在非常早的阶段执行。当您在研究 WebMatrix.WebData 命名空间时,还有一些其他的部分需要查看以了解它是如何工作的。

应用了PreApplicationStartMethod程序集属性:

[assembly: PreApplicationStartMethod(typeof(PreApplicationStartCode), "Start")]

此属性中指定的方法将作为应用程序启动序列的一部分被调用。PreApplicationStartCode.Start() 方法将调用 WebSecurity.PreAppStartInit() 以及执行一些其他配置任务。

您可以通过做同样的事情自己复制此功能。将 PreApplicationStartMethod 属性添加到您的程序集并让它调用您自己的“启动”方法。在这个阶段,您将能够使用 Membership providers 集合。

于 2013-08-04T23:48:41.053 回答