使用 ASP.NET 与 VB 的身份

Using ASP.NET Identity with VB

我已广泛研究 Google 和该网站,但找不到答案。我正在尝试将 ASP.NET 身份添加到 Visual Studio,并且我一直在处理 this page.

问题是,那篇文章中的所有内容都使用 C#,而我的项目专门使用 Visual Basic(ASP.NET Framework 4.5.1,不是 MVC)。另外,我对网络开发人员太陌生了,无法确切知道要更改什么。我找到了一个 C# 到 VB 的转换器,它在大多数情况下都有效,但我仍然遗漏了一些东西,因为我在 VS 中遇到错误。我什至不能 100% 确定我可以让 Identity 在 VB 而不是 C# 中工作,尽管我不明白为什么不这样做。

我尽量保持简洁,所以我会在 粗体 中指出问题。

这是 register.aspx 页面:

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Register.aspx.vb" Inherits="WebFormsIdentity.Register" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body style="font-family: Arial, Helvetica, sans-serif; font-size: small">
    <form id="form1" runat="server">
    <div>
        <h4 style="font-size: medium">Register a new user</h4>
        <hr />
        <p>
            <asp:Literal runat="server" ID="StatusMessage" />
        </p>                
        <div style="margin-bottom:10px">
            <asp:Label runat="server" AssociatedControlID="UserName">User name</asp:Label>
            <div>
                <asp:TextBox runat="server" ID="UserName" />                
            </div>
        </div>
        <div style="margin-bottom:10px">
            <asp:Label runat="server" AssociatedControlID="Password">Password</asp:Label>
            <div>
                <asp:TextBox runat="server" ID="Password" TextMode="Password" />                
            </div>
        </div>
        <div style="margin-bottom:10px">
            <asp:Label runat="server" AssociatedControlID="ConfirmPassword">Confirm password</asp:Label>
            <div>
                <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" />                
            </div>
        </div>
        <div>
            <div>
                <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" />
            </div>
        </div>
    </div>
    </form>
</body>
</html>

VB 中没有错误,但在 运行 页面之后,我在浏览器中得到 'Parser Error':“ 解析器错误消息:无法加载类型'WebFormsIdentity.Register'.

这是后面的代码;大多数问题都与此页面有关:

Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.EntityFramework
Imports System.Linq

Namespace WebFormsIdentity
    Partial Public Class Register
        Inherits System.Web.UI.Page
        Protected Sub CreateUser_Click(sender As Object, e As EventArgs)
            ' Default UserStore constructor uses the default connection string named: DefaultConnection
            Dim userStore = New UserStore(Of IdentityUser)()
            Dim manager = New UserManager(Of IdentityUser)(userStore)

            Dim user = New IdentityUser() With { _
                Key .UserName = UserName.Text _
            }
            Dim result As IdentityResult = manager.Create(user, Password.Text)

            If result.Succeeded Then
                StatusMessage.Text = String.Format("User {0} was created successfully!", user.UserName)
            Else
                StatusMessage.Text = result.Errors.FirstOrDefault()
            End If
        End Sub
    End Class
End Namespace

在'Dim user'下的那一行,'Key'这个词有这个错误:

Name of field or property being initialized in an object initializer must start with '.'.

在'Dim result'这一行,单词'Password'是这样的:

'Password' is not declared. It may be inaccessible due to its protection level

在'result.Succeeded'下面的行中,单词'StatusMessage'是这样的:

'StatusMessage' is not declared. It may be inaccessible due to its protection level.

最后,同一行,'user.UserName' 有这个:

'UserName' is not a member of 'System.Security.Principal.IPrincipal'.

我只使用 VB 大约六个星期,所以我是一个婴儿开发者。我确实知道如何声明,但我不明白为什么上面 link 的作者不需要在他的代码中做任何额外的事情,除了它是 C#。

无论如何,感谢您的阅读和提前的帮助。

好的。 首先删除单词 "KEY" - 它来自 Telerik 转换器 - 我不知道原因。 第二。在您的 HTML 代码中重复 ID=UserName and ID=Password win name="UserName" and name="Password" 希望这会有所帮助。

我能够解决我的问题。步骤:

1) 完全卸载 VS 2013 Premium
2) 安装 VS 2013 Ultimate
3) 当开始一个新项目时,我没有使用空模板,而是选择了 'Web Forms' 和默认的 'Individual User Account' 身份验证。
4) 从 NuGet 包中安装 'Microsoft ASP.NET Identity EntityFramework'

运行 应用程序正常运行;我能够毫无错误地注册用户。

为了以后参考,正确的代码如下。请注意,必须导入 'Owin' 个引用。

Register.aspx:

<%@ Page Title="Register" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site.Master" CodeBehind="Register.aspx.vb" Inherits="WebFormsIdentity.Register" %>

<%@ Import Namespace="WebFormsIdentity" %>
<%@ Import Namespace="Microsoft.AspNet.Identity" %>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <h2><%: Title %>.</h2>
    <p class="text-danger">
        <asp:Literal runat="server" ID="ErrorMessage" />
    </p>

    <div class="form-horizontal">
        <h4>Create a new account</h4>
        <hr />
        <asp:ValidationSummary runat="server" CssClass="text-danger" />
        <div class="form-group">
            <asp:Label runat="server" AssociatedControlID="Email" CssClass="col-md-2 control-label">Email</asp:Label>
            <div class="col-md-10">
                <asp:TextBox runat="server" ID="Email" CssClass="form-control" TextMode="Email" />
                <asp:RequiredFieldValidator runat="server" ControlToValidate="Email"
                    CssClass="text-danger" ErrorMessage="The email field is required." />
            </div>
        </div>
        <div class="form-group">
            <asp:Label runat="server" AssociatedControlID="Password" CssClass="col-md-2 control-label">Password</asp:Label>
            <div class="col-md-10">
                <asp:TextBox runat="server" ID="Password" TextMode="Password" CssClass="form-control" />
                <asp:RequiredFieldValidator runat="server" ControlToValidate="Password"
                    CssClass="text-danger" ErrorMessage="The password field is required." />
            </div>
        </div>
        <div class="form-group">
            <asp:Label runat="server" AssociatedControlID="ConfirmPassword" CssClass="col-md-2 control-label">Confirm password</asp:Label>
            <div class="col-md-10">
                <asp:TextBox runat="server" ID="ConfirmPassword" TextMode="Password" CssClass="form-control" />
                <asp:RequiredFieldValidator runat="server" ControlToValidate="ConfirmPassword"
                    CssClass="text-danger" Display="Dynamic" ErrorMessage="The confirm password field is required." />
                <asp:CompareValidator runat="server" ControlToCompare="Password" ControlToValidate="ConfirmPassword"
                    CssClass="text-danger" Display="Dynamic" ErrorMessage="The password and confirmation password do not match." />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <asp:Button runat="server" OnClick="CreateUser_Click" Text="Register" CssClass="btn btn-default" />
            </div>
        </div>
    </div>
</asp:Content>

Register.aspx.vb:

Imports System
Imports System.Linq
Imports System.Web
Imports System.Web.UI
Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.EntityFramework
Imports Microsoft.AspNet.Identity.Owin
Imports Owin

Partial Public Class Register
    Inherits Page
    Protected Sub CreateUser_Click(sender As Object, e As EventArgs)
        Dim userName As String = Email.Text
        Dim manager = Context.GetOwinContext().GetUserManager(Of ApplicationUserManager)()
        Dim signInManager = Context.GetOwinContext().Get(Of ApplicationSignInManager)()
        Dim user = New ApplicationUser() With {.UserName = userName, .Email = userName}
        Dim result = manager.Create(user, Password.Text)
        If result.Succeeded Then
            ' For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771
            ' Dim code = manager.GenerateEmailConfirmationToken(user.Id)
            ' Dim callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(code, user.Id, Request)
            ' manager.SendEmail(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=""" & callbackUrl & """>here</a>.")

            signInManager.SignIn(user, isPersistent := False, rememberBrowser := False)
            IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
        Else
            ErrorMessage.Text = result.Errors.FirstOrDefault()
        End If
    End Sub
End Class