1

これについてはすでにいくつかの質問があることは知っていますが、私の問題を解決するものはないようです。

VB.NET webForms アプリをデバッグしていますが、(非永続的な Cookie を使用して) FormsAuthentication.SetAuthCookie を動作させることができません。ウォッチウィンドウで確認すると、HttpContext.Current.Userオブジェクトを作成しているように見えますが、オブジェクトは作成されているようですが、「Identity」プロパティは作成されていません。

ブラウザが Cookie をサポートしているかどうかなど、基本的なことをチェックした SO の投稿をたくさん読んだことがあります。比較的言えば、うまく機能します。これが例外をスローする場所は、それを取得するはずの BLL コードから呼び出された場所です。

FormsAuthentication メソッドを呼び出すコードは次のとおりです...:

    'When participant logs in having already created records in DB. 
Protected Sub btnGo_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles btnGo.Click
    If Me.txtUsername.Text.Trim.Length <> 0 AndAlso Me.txtPassword.Text.Trim.Length <> 0 Then
        If Membership.ValidateUser(Me.txtUsername.Text, Me.txtPassword.Text) Then
            FormsAuthentication.SetAuthCookie(Me.txtUsername.Text, False)

            'This is where we run into trouble; the property checks with the forms auth...
            MyBLL.Common.CurrentUser = New MyBLL.User(Me.txtUsername.Text)

            'set site property.. 
            If Site_ IsNot Nothing Then
                MyBLL.Common.CurrentUser.Site = Me.Site_
            End If
            MyBLL.Common.CurrentParticpant = Nothing
            MyBLL.Common.CurrentParticpantVisitID = -1
            Response.Redirect("~/Apps/Dashboard.aspx", True)
        Else
            Me.lblLoginMsg.Visible = True
        End If
    Else
        Me.lblLoginMsg.Visible = True
    End If
End Sub

BLLオブジェクトのコードは次のとおりです(HttpContextからユーザーを呼び出す共有プロパティがあります...)

        Public Shared Property CurrentUser() As MyBLL.User
        Get
            Dim objUser As MyBLL.User

            If Not IsNothing(HttpContext.Current.Session("currentSiteUser")) Then
                objUser = CType(HttpContext.Current.Session("currentSiteUser"), MyBLL.User)
                If objUser.Username <> HttpContext.Current.User.Identity.Name Then
                    objUser = New MyBLL.User(HttpContext.Current.User.Identity.Name)
                    HttpContext.Current.Session("currentSiteUser") = objUser
                End If
            Else
                objUser = New MyBLL.User(HttpContext.Current.User.Identity.Name)
                HttpContext.Current.Session("currentSiteUser") = objUser
            End If

            Return objUser

        End Get
        Set(ByVal value As MyBLL.User)
            '_CurrentUser = value
            HttpContext.Current.Session("currentSiteUser") = value
        End Set
    End Property

これが私の webConfig の Forms 要素です。ここではすべてがうまくいっているように思えます...

    <authentication mode="Forms">
        <forms loginUrl="~/Public/Default2.aspx" defaultUrl="~/Public/Default2.aspx" timeout="60"/>
    </authentication>
4

1 に答える 1

5

メソッドを呼び出した後、すぐにリダイレクトする必要SetAuthCookieがあります。その後の要求でのみ、完全な IPrincipal を初期化する必要があります。HttpContext.Current.User.Identity.Nameメソッドを呼び出した同じコントローラー アクションでアクセスしようとしないでくださいSetAuthCookie。効果はありません。リダイレクトは、次の要求でフォーム認証モジュールが要求 Cookie からプリンシパルを構築するために重要です。

あなたのCurrentUserメソッドでは、プロパティを呼び出しているようですHttpContext.Current.User.Identity.Nameが、これはリダイレクトするまで利用できません。

于 2013-02-05T22:17:35.610 に答える