/// <summary> /// Returns a ClaimsPrincipal object with the NameIdentifier and Name claims, if the request can be /// successfully authenticated based on query string parameter bewit or HTTP Authorization header (hawk scheme). /// </summary> public async Task<ClaimsPrincipal> AuthenticateAsync() { HawkEventSource.Log.Debug( String.Format("Begin HawkServer.AuthenticateAsync for {0} {1}", request.Method.ToString(), request.Uri.ToString())); var principal = new ClaimsPrincipal(new ClaimsIdentity(new List<Claim> { new Claim(ClaimTypes.Name, String.Empty) })); string bewit; bool isBewit = Bewit.TryGetBewit(this.request, out bewit); this.result = isBewit ? Bewit.Authenticate(bewit, now, request, options) : await HawkSchemeHeader.AuthenticateAsync(now, request, options); if (result.IsAuthentic) { HawkEventSource.Log.Debug("Authentication Successful"); // At this point, authentication is successful but make sure the request parts match what is in the // application specific data 'ext' parameter by invoking the callback passing in the request object and 'ext'. // The application specific data is considered verified, if the callback is not set or it returns true. bool isAppSpecificDataVerified = options.VerificationCallback == null || options.VerificationCallback(request, result.ApplicationSpecificData); if (isAppSpecificDataVerified) { // Set the flag so that Server-Authorization header is not sent for bewit requests. this.IsBewitRequest = isBewit; var idClaim = new Claim(ClaimTypes.NameIdentifier, result.Credential.Id); var nameClaim = new Claim(ClaimTypes.Name, result.Credential.User); var identity = new ClaimsIdentity(new[] { idClaim, nameClaim }, HawkConstants.Scheme); principal = new ClaimsPrincipal(identity); } else HawkEventSource.Log.Debug("Invalid Application Specific Data, though authentication is successful"); } HawkEventSource.Log.Debug("End HawkServer.AuthenticateAsync"); return principal; }
/// <summary> /// Returns a ClaimsPrincipal object with the NameIdentifier and Name claims, if the request can be /// successfully authenticated based on query string parameter bewit or HTTP Authorization header (hawk scheme). /// </summary> public async Task<ClaimsPrincipal> AuthenticateAsync() { string bewit; bool isBewit = Bewit.TryGetBewit(this.request, out bewit); if (isBewit) Tracing.Information("Bewit Found"); this.result = isBewit ? Bewit.Authenticate(bewit, now, request, options) : await HawkSchemeHeader.AuthenticateAsync(now, request, options); if (result.IsAuthentic) { // At this point, authentication is successful but make sure the request parts match what is in the // application specific data 'ext' parameter by invoking the callback passing in the request object and 'ext'. // The application specific data is considered verified, if the callback is not set or it returns true. bool isAppSpecificDataVerified = options.VerificationCallback == null || options.VerificationCallback(request, result.ApplicationSpecificData); if (isAppSpecificDataVerified) { // Set the flag so that Server-Authorization header is not sent for bewit requests. this.isBewitRequest = isBewit; var idClaim = new Claim(ClaimTypes.NameIdentifier, result.Credential.Id); var nameClaim = new Claim(ClaimTypes.Name, result.Credential.User); var identity = new ClaimsIdentity(new[] { idClaim, nameClaim }, HawkConstants.Scheme); return new ClaimsPrincipal(identity); } else Tracing.Information("Invalid Application Specific Data, though authentication is successful."); } return Principal.Anonymous; }