To answer your first question. The user is going to bring their own public/private keys to your Dapp, using an Ethereum client such as Mist or Metamask. When a user visits your Dapp, you will be able to read their Ethereum address (kind of their public key). So you will be able to immediately identify who they are.
Libraries like Web3.js, allow you to interact with their public information (eg. address, balance, network, numTxs, etc). Check out the Web3 JavaScript app API for details on what you can do.
Also, if you are concerned about authentication (as it's trivial to spoof their public key), you can use a library like Web3-Auth and ask them to sign a transaction. Only the owner of the real private key will be able to validate their public address.
To answer your second question. Non-blockchain data, ie name, email, phone, etc, could be stored in your preferred, traditional data storage (cloud db, rdbms, etc). You could then use ethereum address
as the key to your user's records when you need to retrieve the information.
My advice is that you start with My First Dapp, as the Truffle Framework is currently the most supported framework for building Dapps. At the end of that tutorial, you should have a much better understanding of how it all works.
Good luck!