【问题标题】:How is this code in FormsAuthenticationModule supposed to work?FormsAuthenticationModule 中的这段代码应该如何工作?
【发布时间】:2013-03-04 12:01:25
【问题描述】:

我正在阅读 .NET4 源代码(它们可以免费下载以供研究),我在 System.Web.Security.FormsAuthenticationModule 的实现中发现了一些奇怪的东西。

类是这样声明的:

public sealed class FormsAuthenticationModule : IHttpModule

IHttpModule 有两种方法 - Init()Dispose()

OnEnter() 里面有这些行:

// Step 2: Call OnAuthenticate virtual method to create 
//    an IPrincipal for this request
OnAuthenticate( new FormsAuthenticationEventArgs(context) );

OnAuthenticate() 声明如下:

// OnAuthenticate: Forms Authentication modules can override 
//             this method to create a Forms IPrincipal object from
//             a WindowsIdentity 
private void OnAuthenticate(FormsAuthenticationEventArgs e) {

现在类是sealed,所以不可能继承。 OnAuthenticate() 也不是 virtual 所以我看不出它怎么可能被覆盖。

所以看起来这些 cmets 已经过时了,不再可能覆盖 OnAuthenticate()

我有什么问题吗?这段代码可能允许覆盖OnAuthenticate()吗?

【问题讨论】:

  • AFAIU 这个类从 beginning987654321@开始密封
  • 从名称和参数可以看出这是一个'event trigger',它们通常应该是虚拟的。这当然与密封相冲突。最坏的情况是一个类可以订阅它自己的事件。

标签: c# .net iis .net-4.0


【解决方案1】:

它不起作用。这只是不正确的文档。对于 MS 来说,这不是第一次。例如,我在 .NET Framework 的 1.1 版中通知了 MS​​,而我们现在是 4.5,文档仍然完全具有误导性:http://msdn.microsoft.com/en-us/library/7he0a7s1.aspx

请注意“继承人须知”部分。当一个类包含多个internal abstract 属性和方法时,应该如何从 BindingManagerBase 派生一个类?然而,在 BindingManagerBase 和 CurrencyManager 的文档中有几个地方有“继承者须知”...

【讨论】:

    【解决方案2】:

    我知道这是旧的,但唯一的方法是在 Global.asax 中实现 FormsAuthenticate_OnAuthenticate 事件。当您将 e.Context.User 设置为一个值时,它会阻止内部代码执行。有点笨重。

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多