That looks fine, though for flags you must remember you cannot increment by ones (1, 2, 3, 4) - it must be done like: 1, 2, 4, 8.
Using your enum definition:
[Flags]
public enum Roles : byte
{
View = 1,
Edit = 2,
Admin = (View | Edit) // Good for code readability - and if the values change
}
You can see that you can detect individual flags set like this (even specifically the Admin one).
Roles role = Roles.Admin;
bool canView = ((role & Roles.View) == Roles.View);
bool canEdit = ((role & Roles.Edit) == Roles.Edit);
bool isAdmin = (role == Roles.Admin);
You can see this work: https://dotnetfiddle.net/0pm4jW
I also like this kind of definition for readability (and not having to calculate the math if I want to add one later).
[Flags]
public enum Roles : byte
{
View = 1 << 0, // 1
Edit = 1 << 1, // 2
Delete = 1 << 2, // 4
Share = 1 << 3, // 8
Admin = (View | Edit | Delete | Share)
}