Asp.NET - 无法通过Facebook登录

时间:2014-08-07 16:32:29

标签: asp.net facebook entity-framework identity owin

我正努力通过使用Visual Studio 2013模板(新网站> Web窗体Asp.NET)通过Facebook进行身份验证。

这个模板的好处在于它为您提供了使用.NET身份所需的所有代码,以及明显易于定制的Facebook(以及其他提供商)的登录功能。

我已完全遵循ASP.NET网站中提供的说明,但仍然收到相同的错误消息:object reference not set to an object instance

Line 35:         If Not IsPostBack Then
Line 36:             Dim manager = New UserManager()
Line 37:             Dim loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo()
Line 38:             If loginInfo Is Nothing Then
Line 39:                 Response.Redirect("~/Account/Login")
[NullReferenceException: Object reference not set to an object instance.]

在我的登录页面的代码后面,我使用以下代码:

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

Public Partial Class Account_Login
    Inherits Page
    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        RegisterHyperLink.NavigateUrl = "Register"
        OpenAuthLogin.ReturnUrl = Request.QueryString("ReturnUrl")
        Dim returnUrl = HttpUtility.UrlEncode(Request.QueryString("ReturnUrl"))
        If Not [String].IsNullOrEmpty(returnUrl) Then
            RegisterHyperLink.NavigateUrl += "?ReturnUrl=" & returnUrl
        End If
    End Sub

    Protected Sub LogIn(sender As Object, e As EventArgs)
        If IsValid Then
            ' Convalidare la password utente
            Dim manager = New UserManager()
            Dim user As ApplicationUser = manager.Find(UserName.Text, Password.Text)
            If user IsNot Nothing Then
                IdentityHelper.SignIn(manager, user, RememberMe.Checked)
                IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
            Else
                FailureText.Text = "Nome utente o password non valida."
                ErrorMessage.Visible = True
            End If
        End If
    End Sub
End Class

在我的Register页面的代码后面,我使用以下代码:

    Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.EntityFramework
Imports Microsoft.AspNet.Identity.Owin
Imports System.Security.Claims
Imports System.Web
Imports Microsoft.Owin.Security

Public Partial Class Account_RegisterExternalLogin
    Inherits System.Web.UI.Page
    Protected Property ProviderName() As String
        Get
            Return If(DirectCast(ViewState("ProviderName"), String), [String].Empty)
        End Get
        Private Set(value As String)
            ViewState("ProviderName") = value
        End Set
    End Property

    Protected Property ProviderAccountKey() As String
        Get
            Return If(DirectCast(ViewState("ProviderAccountKey"), String), [String].Empty)
        End Get
        Private Set(value As String)
            ViewState("ProviderAccountKey") = value
        End Set
    End Property

    Protected Sub Page_Load() Handles Me.Load
        ' Elaborare il risultato fornito da un provider di autenticazione nella richiesta
        ProviderName = IdentityHelper.GetProviderNameFromRequest(Request)
        If [String].IsNullOrEmpty(ProviderName) Then
            Response.Redirect("~/Account/Login")
        End If

        If Not IsPostBack Then
            Dim manager = New UserManager()
            Dim loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo()
            If loginInfo Is Nothing Then
                Response.Redirect("~/Account/Login")
            End If
            Dim appuser = manager.Find(loginInfo.Login)
            If appuser IsNot Nothing Then
                IdentityHelper.SignIn(manager, appuser, isPersistent:=False)
                IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
            ElseIf User.Identity.IsAuthenticated Then
                Dim verifiedloginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo(IdentityHelper.XsrfKey, User.Identity.GetUserId())
                If verifiedloginInfo Is Nothing Then
                    Response.Redirect("~/Account/Login")
                End If
                Dim result = manager.AddLogin(User.Identity.GetUserId(), verifiedloginInfo.Login)
                If result.Succeeded Then
                    IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
                Else
                    AddErrors(result)
                    Return
                End If
            Else
                userName.Text = loginInfo.DefaultUserName
            End If
        End If
    End Sub
    Protected Sub LogIn_Click(sender As Object, e As EventArgs)
        CreateAndLoginUser()
    End Sub
    Private Sub CreateAndLoginUser()
        If Not IsValid Then
            Return
        End If
        Dim manager = New UserManager()
        Dim user = New ApplicationUser() With {.UserName = userName.Text}
        Dim result = manager.Create(user)
        If Not result.Succeeded Then
            AddErrors(result)
            Return
        End If
        Dim loginInfo = Context.GetOwinContext().Authentication.GetExternalLoginInfo()
        If loginInfo Is Nothing Then
            Response.Redirect("~/Account/Login")
            Return
        End If
        result = manager.AddLogin(user.Id, loginInfo.Login)
        If Not result.Succeeded Then
            AddErrors(result)
            Return
        End If
        IdentityHelper.SignIn(manager, user, False)
        IdentityHelper.RedirectToReturnUrl(Request.QueryString("ReturnUrl"), Response)
        Return
    End Sub

    Private Sub AddErrors(result As IdentityResult)
        For Each [error] As String In result.Errors
            ModelState.AddModelError("", [error])
        Next
    End Sub
End Class

现在我正试图让它发挥作用,但我无法找到解决方案。

非常感谢帮助。

由于

1 个答案:

答案 0 :(得分:1)

我通过简单地更新所有包来解决问题。

由于