Then I think you've got one too many negations in there. need() shows the message if the expression is a failure. You can see all the conditions that count as a failure in the documentation, but evaluating to FALSE is one of them.
library(shiny)
print(need("A" %in% c("A", "B"), "The value is something other than 'A' or 'B'"))
#> NULL
print(need("C" %in% c("A", "B"), "The value is is something other than 'A' or 'B'"))
#> [1] "The value is something other than 'A' or 'B'"
Created on 2018-10-29 by the reprex package (v0.2.1)
To keep it straight in my head, I think of it as "I need <expr> to be true in order to pass validation! (otherwise, display my custom message)".