2015-05-08 13 views
5

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

+0

Czy jesteś w stanie udostępnić swoją implementację. Czy masz jakiś szablon sprawdzony w git? – Avi

Odpowiedz

3

znaleźć odpowiedź, YESSS !!!

Więc, znalazłem ten link: http://brockallen.com/2013/01/17/adding-custom-roles-to-windows-roles-in-asp-net-using-claims/

Stamtąd Domyślałem moją drogę przez, dobrze rodzaju :)

Oto podstawy, co zrobiłem:

skończyło się nadpisuje metodę OnAuthentication kontrolera, ale nadal sprawdza połączenie z bazą. Zrobiłem to z rozszerzonej klasy. Oto pomysł:

public class AdfsController : Controller 
{ 
    //Some code for adding the AppUserManager (used Unity) 
    protected override void OnAuthentication(
      System.Web.Mvc.Filters.AuthenticationContext filterContext) 
    { 
     base.OnAuthentication(filterContext); 
     //Private method to set the Principal 
     _setCurrentUser(filterContext.Principal); 
    } 

    private void _setCurrentUser(IPrincipal principal) 
    { 
     //Put code to find to use your ApplicationUserManager or 
     //dbContext. roles is a string array 

     foreach(var role in roles) 
     { 
      ((ClaimsIdentity)((ClaimsPrincipal)principal).Identity) 
       .AddClaim(new Claim(ClaimTypes.Role, role)); 
     } 
    } 
} 

w sterowniku, można dodać następujące:

public class HomeController : AdfsController 
{ 
    //I used a magic string for demo, but store these in my globals class 
    [Authorize(Roles = "CoolRole")] 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

testowałem to poprzez sprawdzenie rolę przypisaną do bieżącego użytkownika, a to działa! Następnie zmieniłem rolę na "odrzucenie", którego użytkownik nie był przypisany; i otrzymałem 401 Nieautoryzowane. Tak, tak, całkiem fajnie!

Wiem, że to ja zadałem to pytanie, ale mam nadzieję, że ktoś uzna to za pomocne i zaoszczędzi im trochę czasu.

~ Pozdrawiam!

+0

Użyłem kodu z zamieszczonego linku, byłoby wspaniale, gdyby dodałem do twojej odpowiedzi również. – Nacht

-2

ADFS jest uwierzytelnienie/tokena usługi w Azure. Aby włączyć uwierzytelnianie oparte na rolach, można użyć usługi Azure RBAC (Role Based Access Controll) w celu zwiększenia liczby roszczeń otrzymywanych z ADFS i dodania ról otrzymywanych z RBAC do tokena i używania tego samego tokena w API więc zablokować lub zabezpieczyć backend z tej rozszerzonej tokena ... jest tu odniesienie do RBAC:

http://azure.microsoft.com/en-in/documentation/articles/role-based-access-control-configure/

+0

Używa Azure AD do zarządzania użytkownikami. Nie chcę używać Azure AD do zarządzania użytkownikiem, ponieważ chcę użyć ADFS (lokalnego) do uwierzytelnienia. Ponadto nie próbuję zabezpieczyć mojego API. Próbuję zabezpieczyć nową aplikację MVC. – Rogala

+0

Uzgodniono z Rogala – Avi