Szukałem odpowiedzi na to pytanie od kilku dni, ale nie znalazłem żadnego sukcesu. Dodałbym linki, ale prawdopodobnie zajmie całą stronę.Dodaj role do ADFS IPrincipal
Więc tutaj jest to, co mam ...
Mam aplikacji MVC, który używa protokołu WC-Federation. Udało mi się skonfigurować aplikację, aby uwierzytelniła użytkowników i zwróciła roszczenia z ADFS. Działa to idealnie. Mogę również wyodrębnić wszystkie roszczenia bez żadnych problemów. Ale robię to w ramach jednego z działań kontrolera.
I tu jest to, co chcę zrobić ...
Chcę użyć programu ADFS do uwierzytelniania użytkownika, ale chcę używać własnych ról wewnętrznych zezwolić użytkownikowi na dostęp do poszczególnych sterowników (np [Authorize(Roles = "CoolRole")]
.) Chcę móc to zrobić, ponieważ mam już Web API, który używa OAuth 2.0, z backendową bazą danych SQL Server do zarządzania użytkownikami i rolami (wewnętrznym i zewnętrznym użytkownikiem). Teraz chcę mieć bezpieczny portal, który będzie umożliwiać użytkownikom wewnętrznym dostęp do danych za pomocą funkcji jednokrotnego logowania. Patrząc na modelu Controller
zauważyłem pewne właściwości związanych z procesem uwierzytelniania (OnAuthentication
, OnAuthenticationChallenge
) oraz jeden dla procesu autoryzacji (OnAuthorization
.)
nie koniecznie potrzebny jest kod, ale czuję, że uderzyłem w cegłę i muszę być skierowany we właściwym kierunku.
UPDATE
Próbowałem to:
protected override void OnAuthorization(
System.Web.Mvc.AuthorizationContext filterContext)
{
//Private class to create a new IPrincipal based on my AppUserMgr
var user = _setCurrentUser(
(ClaimsIdentity)filterContext.HttpContext.User.Identity);
filterContext.HttpContext.User = user;
base.OnAuthorization(filterContext);
}
To zwróciło 401 (Nieautoryzowany) odpowiedzi.
i ...
protected override void OnAuthentication(
System.Web.Mvc.Filters.AuthenticationContext filterContext)
{
//Private class to create a new IPrincipal based on my AppUserMgr
var user = _setCurrentUser(
(ClaimsIdentity)filterContext.HttpContext.User.Identity);
filterContext.Principal = user;
base.OnAuthorization(filterContext);
}
To właśnie nazywa STS wiele razy, zanim to się nie powiedzie. Próbowałem nawet zamiany po przypisaniu do po wywołaniu bazy w obu. Brak szczęścia.
Przed poprzednimi, próbowałem też dodać AuthorizeFilter do kontroli, ale to nie pomogło:
http://pratapreddypilaka.blogspot.in/2012/03/custom-filters-in-mvc-authorization.html
Czy jesteś w stanie udostępnić swoją implementację. Czy masz jakiś szablon sprawdzony w git? – Avi