/// <summary> /// Validate the core properties of the request. /// </summary> /// <param name="authRequest"></param> /// <returns></returns> public async Task <InvokeResult <AuthResponse> > AccessTokenGrantAsync(AuthRequest authRequest) { var requestValidationResult = _authRequestValidators.ValidateAuthRequest(authRequest); if (!requestValidationResult.Successful) { return(InvokeResult <AuthResponse> .FromInvokeResult(requestValidationResult)); } var accessTokenRequestValidationResult = _authRequestValidators.ValidateAccessTokenGrant(authRequest); if (!accessTokenRequestValidationResult.Successful) { return(InvokeResult <AuthResponse> .FromInvokeResult(accessTokenRequestValidationResult)); } var signInRequest = await _signInManager.PasswordSignInAsync(authRequest.UserName, authRequest.Password, true, false); if (!signInRequest.Successful) { return(InvokeResult <AuthResponse> .FromInvokeResult(signInRequest)); } _adminLogger.AddCustomEvent(Core.PlatformSupport.LogLevel.Message, "AuthTokenManager_AccessTokenGrantAsync", "UserLoggedIn", new KeyValuePair <string, string>("email", authRequest.UserName)); var appUser = await _userManager.FindByNameAsync(authRequest.UserName); if (appUser == null) { /* Should really never, ever happen, but well...let's track it */ _adminLogger.AddCustomEvent(Core.PlatformSupport.LogLevel.Error, "AuthTokenManager_AccessTokenGrantAsync", UserAdminErrorCodes.AuthCouldNotFindUserAccount.Message, new KeyValuePair <string, string>("email", authRequest.UserName)); return(InvokeResult <AuthResponse> .FromErrors(UserAdminErrorCodes.AuthCouldNotFindUserAccount.ToErrorMessage())); } if (String.IsNullOrEmpty(authRequest.AppInstanceId)) { /* This generally happens for the first time the app is logged in on a new device, if it is logged in again future times it will resend the app id */ var appInstanceResult = await _appInstanceManager.CreateForUserAsync(appUser.Id, authRequest); authRequest.AppInstanceId = appInstanceResult.Result.RowKey; } else { var updateLastLoginResult = (await _appInstanceManager.UpdateLastLoginAsync(appUser.Id, authRequest)); if (updateLastLoginResult.Successful) { authRequest.AppInstanceId = updateLastLoginResult.Result.RowKey; } else { return(InvokeResult <AuthResponse> .FromInvokeResult(updateLastLoginResult.ToInvokeResult())); } } var refreshTokenResponse = await _refreshTokenManager.GenerateRefreshTokenAsync(authRequest.AppId, authRequest.AppInstanceId, appUser.Id); return(_tokenHelper.GenerateAuthResponse(appUser, authRequest, refreshTokenResponse)); }