0

I have a custom authorize program called CustomAuthorize that inherits AuthorizeAttribute that simply restricts access to certain controllers and resources based on various factors specific to the user. However, I get an error on the following line:

The line:

Protected Overrides Function AuthorizeCore(httpContext As HttpContextBase) As Boolean

The error:

An unhandled exception of type 'System.StackOverflowException' occurred in MyBlog.DLL

Here's my whole code:

Public Class CustomAuthorize Inherits AuthorizeAttribute

Protected Overrides Function AuthorizeCore(httpContext As HttpContextBase) As Boolean

    Dim authorized = AuthorizeCore(httpContext)

    ' if user is not authorized, restrict access
    If (authorized = False) Then

        Return False

    End If

    ' get user name
    Dim username = httpContext.User.Identity.Name

    ' get user
    Dim user = Membership.GetUser(username, True)

    ' get user's profile
    Dim db As UserProfileDbContext = New UserProfileDbContext
    Dim profile = db.UserProfiles.Where(Function(x) x.UserId = user.ProviderUserKey).Single

    ' TODO: if user doesn't have a profile, return false

    ' get route
    Dim routeData = httpContext.Request.RequestContext.RouteData

    ' get controller
    Dim controller = routeData.Values("controller").ToString

    ' get id
    Dim id = routeData.Values("id").ToString

    ' if no id is set, check to see if the user owns the requested entity (company or blog)
    If String.IsNullOrEmpty(id) = True Then

        If controller.ToLower = "blog" Or controller.ToLower = "article" Then

            If profile.IsCompanyOwner Or profile.IsBlogOwner = True Then

                ' if user is owner of a blog with no specified id, then it will default to their own blog
                Return True

            End If

        End If

    Else

        ' if controller = blog
        '       check for blog id

        If controller.ToLower = "blog" Then

            ' check to see if the user owns the company to which the blog belongs
            If profile.IsCompanyOwner Then

                ' get company from blog id
                Dim db1 As BlogDbContext = New BlogDbContext
                Dim blog = db1.Blogs.Where(Function(b) b.BlogId = id).Single()

                If blog.CompanyId = profile.CompanyId Then

                    Return True

                End If

            ElseIf profile.IsBlogOwner Then

                ' if user's blog id is the blog being requested, grant access
                If profile.BlogId = id Then

                    Return True

                End If

            End If

        End If

        ' if controller = article
        '       check for article blog id

        If controller.ToLower = "article" Then

            Dim db2 As ArticleDbContext = New ArticleDbContext
            Dim article = db2.Articles.Where(Function(a) a.ArticleId = id).Single
            Dim articleBlogId = article.BlogId

            ' check to see if the user owns the company to which the blog belongs
            If profile.IsCompanyOwner Then

                ' get company from blog id
                Dim db1 As BlogDbContext = New BlogDbContext
                Dim blog = db1.Blogs.Where(Function(b) b.BlogId = articleBlogId).Single()

                If blog.CompanyId = profile.CompanyId Then

                    Return True

                End If

            ElseIf profile.IsBlogOwner Then

                ' if user's blog id is the blog being requested, grant access
                If profile.BlogId = articleBlogId Then

                    Return True

                End If

            End If

        End If

    End If

    ' if we got this far, then the user shouldn't have access
    Return False

End Function

Protected Overrides Sub HandleUnauthorizedRequest(filterContext As AuthorizationContext)
    Dim result = New ViewResult()
    result.ViewName = "Error"
    result.ViewBag.ErrorMessage = "oops, you are not allowed"
    filterContext.Result = result
End Sub

End Class

How can I fix this error? Thank you.

2 Answers 2

1

I think you want to call the MyBase.AuthorizeCore.

So you want to change this line

Dim authorized = AuthorizeCore(httpContext)

to

Dim authorized = MyBase.AuthorizeCore(httpContext)
Sign up to request clarification or add additional context in comments.

Comments

1

The first line of your function is Dim authorized = AuthorizeCore(httpContext)

This line will call your method again, and the first line of that new call will do the same, ad infinitum. This causes a StackOverflowException.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.