1

我在 asp.net Web 应用程序中有以下自定义模块。该模块在我的 PC 上通过 chrome 工作,但是当我尝试从 Android 访问视频时,由于未设置用户 ID(_context.User)而出现错误。这一切都发生在我登录应用程序之后。因此 _context.User 应该被设置。

我会认为,因为在这个级别,您正在处理 HTTP 请求和响应,该模块适用于任何设备。

我有两个问题。

有没有办法使这项工作?

导致此问题的 Android 平板电脑和 PC 发送的请求有什么区别?

公共类 VideoSecurityModule 实现 IHttpModule 实现 IRequiresSessionState Private WithEvents _context 作为 HttpApplication

Public Sub Dispose() Implements IHttpModule.Dispose
End Sub

Dim myUserManager As UserManager

Public Sub Init(ByVal context As HttpApplication) Implements IHttpModule.Init
    _context = context
    myUserManager = New UserManager
   End Sub

Public Sub Log(value As String, ParamArray args As Object())
    Dim message As String = String.Format(value, args)
    Dim messagePrefix As String = String.Format("{0},{1},{2},{3}", UserAgent, Url, SessionId, message)
    LogManager.WriteMessage(messagePrefix, "")
End Sub

Private ReadOnly Property UserAgent() As String
    Get
        Try
            Return _context.Request.UserAgent
        Catch ex As Exception
            Return "No User Agent"
        End Try
    End Get
End Property

Private ReadOnly Property Url() As String
    Get
        Try
            Return _context.Request.Url.PathAndQuery
        Catch ex As Exception
            Return "No URL"
        End Try
    End Get
End Property

Private ReadOnly Property SessionId() As String
    Get
        Try
            Return __context.Session.SessionID
        Catch ex As Exception
            Return "No URL"
        End Try
    End Get
End Property


Public ReadOnly Property IsReusable() As Boolean
    ' IsReusable must be set to false since class has a member!
    Get
        Return True
    End Get
End Property

Public Sub OnAuthorizeRequest(ByVal source As Object, ByVal e As EventArgs) Handles _context.AuthorizeRequest

    If IsVideoUrl() Then

        Dim userId As Integer = GetLoggedInUsersId()
        Log("UserRequiresAuthorization({0}): {1}", userId, UserRequiresAuthorization(userId))
        Log("UserIsAssignedToCourseContainingVideo({0}): {1}", userId, UserIsAssignedToCourseContainingVideo(userId))
        ' if user is not assigned to a course that utilizes the video or the user is not in role super user or system admin
        If (UserRequiresAuthorization(userId) AndAlso Not UserIsAssignedToCourseContainingVideo(userId)) Then
            SendAuthenticationRequiredResponse()
        End If
    End If
End Sub

Private Function GetLoggedInUsersId() As Integer
    Dim userId As Integer = 0
    If (Not _context.User Is Nothing) Then
        userId = myUserManager.GetUserIdByUserName(_context.User.Identity.Name)
    End If
    Log("userId:{0}", userId)
    Return userId
End Function


Private Sub SendAuthenticationRequiredResponse()
    Const networkAuthenticationRequiredStatusCode As Integer = 511
    _context.Response.StatusCode = networkAuthenticationRequiredStatusCode
    _context.Response.ClearContent()
    _context.Response.Write("UnAuthorized User")
    Log("UnAuthorized User: {0}", "")
    _context.Response.End()
End Sub

Private Function IsVideoUrl() As Boolean
    Dim fileLocation As String = System.Configuration.ConfigurationManager.AppSettings("VideoLocation")
    Log("url:{0}", _context.Request.Url)
    Log("IsVideoUrl:{0}", _context.Request.FilePath.ToLower().Contains(fileLocation.ToLower()))
    Return _context.Request.FilePath.ToLower().Contains(fileLocation.ToLower())
End Function

Private Function UserDoesNotRequireAuthorization(userId As Integer) As Boolean
    Return myUserManager.IsSysAdmin(userId) OrElse myUserManager.IsSuperUser(userId)
End Function

Private Function UserRequiresAuthorization(userId As Integer) As Boolean
    Dim result As Boolean = Not UserDoesNotRequireAuthorization(userId)
    Return result
End Function


''' <summary>
''' Returns true if the in-putted user (logged in user) has been allocated to a course that utilize video specified in this request
''' </summary>
Private Function UserIsAssignedToCourseContainingVideo(userId As Integer) As Boolean
    ' ... code removed for clarity
End Function

结束类

4

1 回答 1

0

这是多个版本的 android 的已知问题。我有限的研究表明,视频请求被传递到 android 中一个名为 stagefright 的单独组件。Stagefright 无法处理 cookie,因此不会将身份验证 cookie 传递给 Web 应用程序,从而导致 _context.User 属性未设置。

以下链接提供了更深入的详细信息。

移动浏览器是否通过 HTML5 音频标签发送 httpOnly cookie? https://code.google.com/p/android/issues/detail?id=17553

于 2014-08-05T03:36:33.490 回答