【问题标题】:VB ASP .NET MVC Custom Membership ProviderVB ASP .NET MVC 自定义成员资格提供程序
【发布时间】:2012-08-23 00:00:30
【问题描述】:

我找到的所有示例都是用 C# 编写的,如果是 VB,我需要一个。如何将下面的代码转换为继承所有 Membership 提供程序功能?

Imports System.Data.Entity
Imports MyBlog

Namespace MyBlog

    Public Class EmployeeController
        Inherits System.Web.Mvc.Controller

        Private db As EmployeeDbContext = New EmployeeDbContext

        '
        ' GET: /Employee/LogOn

        Public Function LogOn() As ActionResult
            Return View()
        End Function

    End Class

End Namespace

这是我读过的文章Custom membership or notImplementing custom login for ASP.NET MVC。我似乎不能在 VB 中继承多个类(不经常使用继承或实现或接口)。

【问题讨论】:

  • 类不是接口,.NET 不支持多继承
  • 为什么要让控制器继承 Membership 类?通常,您只需从控制器方法中调用静态方法,例如“Membership.ValidateUser(...)”。
  • 这就是我正在收集的内容。如何创建会员提供商?我必须省略 system.web.mvc.controller 吗?或者我应该在单独的文件中创建会员提供程序,然后将其导入我的控制器?这更像是一个设计问题。
  • 不清楚你在问什么,遇到了什么问题。你不知道如何编写一个派生自MembershipProvider 的类并重写它的方法? VB.NET 语法有问题?

标签: asp.net-mvc vb.net asp.net-mvc-3 asp.net-membership


【解决方案1】:

我有一个更简单的解决方案。使用 nuget 安装griffin.mvccontrib。然后像这样创建一个新类:

public class MyAccountRepository implements IAccountRepository
end class

在界面上按CTRL+.,导入正确的命名空间。在类名上按CTRL+. 以获取所有方法及其描述。

然后使用您的EmployeeDBContext 简单地实现它们。

通过这样做,您可以保留其他所有内容(使用标准 Internet MVC 模板)

指令:http://blog.gauffin.org/2011/09/a-more-structured-membershipprovider/

【讨论】:

  • 谢谢你,jgauffin。作为承包商,我将在完成后交付这个系统,所以我宁愿让它尽可能简单。这看起来是一个不错的解决方案,但我认为 Darin 的另一个解决方案对于我的代码的未来管理员来说会更容易理解。
  • 正确实施会员提供者并非易事。祝你好运。
【解决方案2】:

您需要编写一个继承自MembershipProvider 的类并覆盖您感兴趣的方法:

Public Class MyCustomMembershipProvider
    Inherits System.Web.Security.MembershipProvider

    Public Overrides Property ApplicationName As String
        Get

        End Get
        Set(value As String)

        End Set
    End Property

    Public Overrides Function ChangePassword(username As String, oldPassword As String, newPassword As String) As Boolean

    End Function

    Public Overrides Function ChangePasswordQuestionAndAnswer(username As String, password As String, newPasswordQuestion As String, newPasswordAnswer As String) As Boolean

    End Function

    Public Overrides Function CreateUser(username As String, password As String, email As String, passwordQuestion As String, passwordAnswer As String, isApproved As Boolean, providerUserKey As Object, ByRef status As System.Web.Security.MembershipCreateStatus) As System.Web.Security.MembershipUser

    End Function

    Public Overrides Function DeleteUser(username As String, deleteAllRelatedData As Boolean) As Boolean

    End Function

    Public Overrides ReadOnly Property EnablePasswordReset As Boolean
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property EnablePasswordRetrieval As Boolean
        Get

        End Get
    End Property

    Public Overrides Function FindUsersByEmail(emailToMatch As String, pageIndex As Integer, pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection

    End Function

    Public Overrides Function FindUsersByName(usernameToMatch As String, pageIndex As Integer, pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection

    End Function

    Public Overrides Function GetAllUsers(pageIndex As Integer, pageSize As Integer, ByRef totalRecords As Integer) As System.Web.Security.MembershipUserCollection

    End Function

    Public Overrides Function GetNumberOfUsersOnline() As Integer

    End Function

    Public Overrides Function GetPassword(username As String, answer As String) As String

    End Function

    Public Overloads Overrides Function GetUser(providerUserKey As Object, userIsOnline As Boolean) As System.Web.Security.MembershipUser

    End Function

    Public Overloads Overrides Function GetUser(username As String, userIsOnline As Boolean) As System.Web.Security.MembershipUser

    End Function

    Public Overrides Function GetUserNameByEmail(email As String) As String

    End Function

    Public Overrides ReadOnly Property MaxInvalidPasswordAttempts As Integer
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property MinRequiredNonAlphanumericCharacters As Integer
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property MinRequiredPasswordLength As Integer
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property PasswordAttemptWindow As Integer
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property PasswordFormat As System.Web.Security.MembershipPasswordFormat
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property PasswordStrengthRegularExpression As String
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property RequiresQuestionAndAnswer As Boolean
        Get

        End Get
    End Property

    Public Overrides ReadOnly Property RequiresUniqueEmail As Boolean
        Get

        End Get
    End Property

    Public Overrides Function ResetPassword(username As String, answer As String) As String

    End Function

    Public Overrides Function UnlockUser(userName As String) As Boolean

    End Function

    Public Overrides Sub UpdateUser(user As System.Web.Security.MembershipUser)

    End Sub

    Public Overrides Function ValidateUser(username As String, password As String) As Boolean

    End Function
End Class

然后您在 web.config 中注册您的自定义提供程序:

<membership defaultProvider="MyMembership">
    <providers>
        <clear />
        <add 
            name="MyMembership" 
            type="MvcApplication1.MyCustomMembershipProvider, MvcApplication1" enablePasswordRetrieval="false" 
        />
    </providers>
</membership>

现在,您只需在控制器中使用 Membership 类即可。例如,在您创建项目时由默认模板生成的 LogOn 操作中,您绝对不需要更改任何内容:

<HttpPost()> _
Public Function LogOn(ByVal model As LogOnModel, ByVal returnUrl As String) As ActionResult
    If ModelState.IsValid Then
        If Membership.ValidateUser(model.UserName, model.Password) Then
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe)
            If Url.IsLocalUrl(returnUrl) AndAlso returnUrl.Length > 1 AndAlso returnUrl.StartsWith("/") _
               AndAlso Not returnUrl.StartsWith("//") AndAlso Not returnUrl.StartsWith("/\\") Then
                Return Redirect(returnUrl)
            Else
                Return RedirectToAction("Index", "Home")
            End If
        Else
            ModelState.AddModelError("", "The user name or password provided is incorrect.")
        End If
    End If

    ' If we got this far, something failed, redisplay form
    Return View(model)
End Function

所有对 Membership 的调用现在都将使用您在 web.config 中注册的自定义成员资格提供程序。

【讨论】:

  • 在MVC中,类应该去哪里?那么,如何在我的控制器中使用该类来执行诸如 LogOn 之类的操作(就像“股票”成员资格提供程序一样)?
  • 您可以将此类放在项目的子文件夹中。例如Providers。在您的控制器中,您只需使用例如Membership.ValidateUser("username", "password")。我已经更新了我的答案来说明。
  • 谢谢,我希望这不会太难。 ApplicationName 是否需要覆盖或者我可以忽略它吗?
  • 你可以忽略它。但是从您打算省略的所有方法中抛出一个NotImplementedException。以后调试问题会更容易。不幸的是,当我实现抽象类时,Visual Studio 没有为我生成它们,这是用 C# 自动完成的。我不知道为什么它不使用 VB.NET,但请确保您这样做并且不要将这些方法留空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
相关资源
最近更新 更多