自己写了一个连接到Oracle数据库的MemberShipProvider提供程序,实现了ValidateUser方法,但是这个方法,我加了一个新的参数,就是登录机器的IP地址,因为数据库验证里面要求某一些用户只能特定的IP地址的机器上登录。
    Public Overloads Function ValidateUser(ByVal username As String, ByVal
password As String, ByVal ip As String) As Boolean
        Dim da As New DataAccess(Me.fConnectionString)  ' 自己写的一个和数据库关联的类,用于和用户相关的操作
        fStatus = da.CheckUser(username, password, ip)  ' fStatus 表示登录状态 
        Return fStatus = 0
    End Function    Public Overrides Function ValidateUser(ByVal username As String, ByVal
password As String) As Boolean
        Throw New NotSupportedException
    End Function只有两个参数username和password的这个方法如果被调用,则抛出异常。
现在在页面上使用Login控件登录的时候,应用程序跑出了我写的那个NotSupportedException。也就是说,Login控件调用了ValidateUser(string, string)这个函数。因为每个用户登录的机器是有IP地址限定的,并且每个用户可以登录的IP地址段是不同的。所以不方便使用Login的几个事件去判断IP地址是否有效。现在的问题是:如何指定Login控件调用我写的另外一个ValidateUser(string, string, string)的这个重载方法?或者说如何使用MemberShip去调用我新写的这个ValidateUser方法?谢谢!

解决方案 »

  1.   

    对Login控件的Authenticate事件做手脚   Protected Sub Login1_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles Login1.Authenticate
                e.Authenticated = Membership.ValidateUser( username, password, ip)
        End Sub
      

  2.   

    绿豆,你的这个代码你有没有试过?我用MemberShip.ValidateUser()的时候,只能看到username,password的这个函数,我自己写的那个没有出来,直接添加IP这个参数后,提示我给这个函数增加的参数太多。
      

  3.   

    这是没办法做到的,或者说做到了也破坏了MembershipProvider模型了。MembershipProvider的方法,构成一个契约,你要继承它必须满足这个契约,你改动契约了就不应该继承它。
      

  4.   

    找到MembershipProvider的源代码。添加一个ValidateUser方法即可
      

  5.   

    谢谢 cat_hsfz 的解答,你说的意思我明白了。不过,现在我又遇到了新的问题,CreateUser过程中出现了问题,因为用户还有一些附加的信息需要被保存,MembershipProvider基类中的CreateUser方法这么说也是无法扩展的了?我又该如何保存我的这些扩展信息呢?用Profile吗?从网上搜索了一下,有用Profile这样一说。
      

  6.   

    你可以在数据库中增加字段保存自定义信息。但这要在CreateUser后另外操作。