Imports System.Net.Http.Headers Imports System.Security.Claims Imports System.Text.Encodings.Web Imports System.Threading.Tasks Imports Microsoft.AspNetCore.Authentication Imports Microsoft.Extensions.Logging Imports Microsoft.Extensions.Options Imports Microsoft.AspNetCore.Http.Abstractions Public Class BasicAuthentificationHandler Inherits AuthenticationHandler(Of AuthenticationSchemeOptions) ReadOnly _userService As IUserService Public Sub New(userService As IUserService, options As Microsoft.Extensions.Options.IOptionsMonitor(Of AuthenticationSchemeOptions), logger As ILoggerFactory, encoder As UrlEncoder, clock As ISystemClock) MyBase.New(options, logger, encoder, clock) _userService = userService End Sub Protected Overrides Function HandleChallengeAsync(properties As AuthenticationProperties) As Task GetResponse().Headers("WWW-Authenticate") = "Basic" Return MyBase.HandleChallengeAsync(properties) End Function Private Function GetResponse() As Object Return Response End Function Protected Overrides Function HandleAuthenticateAsync() As Task(Of AuthenticateResult) Dim username As String = "" Try Dim authHeader = AuthenticationHeaderValue.Parse(GetResponse().Headers("Authorization")) Dim credentials = Encoding.UTF8.GetString(Convert.FromBase64String(authHeader.Parameter)).Split(":") username = credentials.FirstOrDefault Dim password = credentials.LastOrDefault If Not _userService.CheckUser(username, password) Then Throw New NotImplementedException("Invalid Username or password") End If Catch ex As Exception Return Task.FromResult(AuthenticateResult.Fail(ex.Message)) End Try Dim claims = {New Claim(ClaimTypes.Name, username)} Dim idendity = New ClaimsIdentity(claims, Scheme.Name) Dim principal = New ClaimsPrincipal(idendity) Dim ticket = New AuthenticationTicket(principal, Scheme.Name) Return Task.FromResult(AuthenticateResult.Success(ticket)) End Function End Class