我正在阅读.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
,所以我看不出它是如何被覆盖的。
所以看起来这些评论已经过时,而且无法再覆盖OnAuthenticate()
。
我有什么不对吗?这段代码可能允许覆盖OnAuthenticate()
吗?
答案 0 :(得分:1)
它不起作用。这只是不正确的文档。不是MS的第一个。例如,我在.NET Framework 1.1版中向MS通知了这一点,这里我们处于4.5,并且文档仍然完全具有误导性:http://msdn.microsoft.com/en-us/library/7he0a7s1.aspx
请注意“对继承者的说明”部分。当人们包含多个internal abstract
属性和方法时,有人应该如何从BindingManagerBase派生一个类?然而,BindingManagerBase和CurrencyManager的文档中有几个地方有“Notes to Inheritors”......
答案 1 :(得分:0)
我知道这是旧的,但唯一的方法是在 Global.asax 中实现 FormsAuthenticate_OnAuthenticate 事件。当您将 e.Context.User 设置为一个值时,它会阻止执行内部代码。有点笨重。