On update cascade is just normal. If you change
referred ID for any reason (why should you?) - the
referring foreign key will be updated.
On delete cascade is also normal as when one person is deleted, all of hes/her friednship relations should be deleted too.
Well, what you desire is just normal.
Still, you can't assure with DDL, that the two foreign keys are not referring the same record in the other table. This is for some reason unacceptable for MSSQL Server - it complains about situations that can't appear.
Still, if you try the same thing in MySQL, PostgreSQL it will work without restriction. It is not your fault - your design is not wrong.
Add both foreign key constraints with "no action" and implement trigger(s) instead of trying to rely on DDL enforced action. Something like this:
CREATE TRIGGER AppUser_AD
ON dbo.AppUser
AFTER DELETE AS
BEGIN
DELETE FROM dbo.Friend
WHERE
AFriendId in (SELECT id FROM DELETED)
OR
BFriendId in (SELECT id FROM DELETED)
END
GO