Powiedzmy, że mam aplikację ASP.Net MVC i ta aplikacja (UI) odwołuje się do warstwy logiki biznesowej (BLL), a BLL odwołuje się do mojej warstwy dostępu do danych (DAL)..Net Członkostwo w aplikacji nTier
Korzystam z usługi Custom Membership and Role Provider dla autoryzacji.
Próbuję określić, jakie warstwy muszą odnosić się do mojego dostawcy członkostwa.
w MVC można przeprowadzić kontrole zezwolenia w następujący sposób:
[Authorize(Roles = "SomeRoleName")]
public ActionResult Index()
{
//do something
}
I w moim BLL może chcę sprawdzić, czy użytkownik znajduje się w rolę, a także:
public static bool IsRoleEditor(User user, Role userRole)
{
bool retValue = false;
if (user.Application.AppID == UserRole.Application.AppID)
{
if (Roles.IsUserInRole("ModifyRoles"))
{
retValue = true;
}
return retValue;
}
Będę musiał odwołać i utworzyć instancję klasy Membership w obu warstwach, jeśli to zrobię. Czy to jest właściwy sposób na zaprojektowanie takiej aplikacji? Wydaje się, że dużo redundancji.
Od kiedy mam BLL, czy należy unikać używania atrybutów "[Authorize (Roles =" SomeRoleName ")]] i zamiast tego wywoływać funkcję BLL z kodu MVC, aby sprawdzić, czy użytkownik jest w roli? Jeśli to zrobię, MVC nadal potrzebuje odniesienia do dostawcy członkostwa w celu uwierzytelnienia i tak czy inaczej, aby skorzystać z logowania i innych formantów ASP, prawda?
Czy jestem daleko od bazy i zmierzam w złym kierunku?
Zdecydowanie użyj atrybutu Authorize w MVC. Nie musisz ręcznie sprawdzać wartości IsInRoles. –
Problem polega na tym, że muszę przetwarzać dodatkową logikę biznesową oprócz "IsInRole" lub "Authorize", które moim zdaniem powinny zawsze być w BLL. Mogę przekazać obiekt użytkownika wszędzie, ale dlaczego nie po prostu pominąć Authorize i używać tylko BLL. – Jay