lewiSnort
lewiSnort

Reputation: 451

.NET 4.0 FormsAuthentication.SetAuthCookie FAIL

I know there are a few questions out there on this already but none seem to help my problem.

I am debugging a VB.NET webForms app and I cannot Get FormsAuthentication.SetAuthCookie to work (with a non-persistent cookie). It seems to create an HttpContext.Current.User object when I check for it in a watch window it seems to have created the object, but not its "Identity" property.

I've read a bunch of SO posts checked the basic things, like seeing if my browser supports cookies, etc... This project is a direct port from an earlier project of ours, which uses the same code for all things listed here, and it works just fine, relatively speaking. Where this throws an exception is where it's called from my BLL code that is supposed to get it.

Here is the code that calls the FormsAuthentication method...:

    '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

Here is the code for the BLL object (which has a shared property calling user from 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

Here is the Forms element from my webConfig; everything seems alright here to me...

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

Upvotes: 1

Views: 4650

Answers (1)

Darin Dimitrov
Darin Dimitrov

Reputation: 1039268

You should immediately redirect after callaing the SetAuthCookie method and only on subsequent requests you may hope to get the full IPrincipal to be initialized. Do not try to access HttpContext.Current.User.Identity.Name in the same controller action in which you called the SetAuthCookie method. It won't have any effect. The redirect is important so that on the next request the forms authentication module will built the principal from the request cookie.

In your CurrentUser method you seem to be calling the HttpContext.Current.User.Identity.Name property but this is not available until you redirect.

Upvotes: 5

Related Questions