Utente impostato su nulla nel modulo HTTP Webforms ASP.NET
-
23-12-2019 - |
Domanda
Ho il modulo personalizzato sotto un'applicazione Web ASP.NET.Il modulo funziona da Chrome sul mio PC, ma quando provo ad accedere a un video da Android ricevo un errore perché l'userid (_Context.User) non è impostato.Questo tutto si verifica dopo aver effettuato l'accesso all'applicazione.Pertanto _Context.User dovrebbe essere impostato.
Avrei pensato perché a questo livello hai a che fare con le richieste e le risposte HTTP che il modulo funzioni per qualsiasi dispositivo.
Ho due domande.
C'è un modo per fare questo lavoro?
Qual è la differenza tra le richieste inviate da Android Tablet e PC per causare questo problema?
Video di classe pubblicaModule Implementa IHTTPModule. Implementa irequiressessionstate. Servizi privati _Context come htpapplication
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
.
Classe finale
Soluzione
Questo è un problema noto con una versione versioni di Android.La mia ricerca limitata suggerisce che le richieste video sono passate a un componente separato in Android chiamato Stagefright.Stagefright Impossibile gestire i cookie e quindi nessun cookie di autenticazione viene trasmesso all'applicazione Web risultante nella proprietà _Context.User che non viene impostata.
I seguenti collegamenti forniscono ulteriori dettagli in profondità.
I browser mobili inviano i cookie htt.Il tag audio HTML5? https://code.google.com/p/android/issues/Dettaglio? ID= 17553