2013-02-26 24 views
14

Mam aplikacji MVC4 Web, który używa uwierzytelniania systemu Windows, który jest w pliku web.config mam
<authentication mode="Windows" /> I to działa dobrze i wszystko jest w porządku.Użyj uwierzytelniania Anonymous w MVC4 na pojedynczym kontrolerze gdy cała aplikacja korzysta z systemu Windows Authenticaion

Jednak teraz potrzebuję kontrolera (w rzeczywistości kontrolera Web API), do którego należy uzyskać anonimowy dostęp z komponentu innego producenta. Problem polega na tym, że za każdym razem, gdy chcę wywołać tę metodę, żąda poświadczeń użytkownika.

Próbowałem wstawić atrybut AllowAnonymous do kontrolera i metod, ale nie udało się.

[AllowAnonymous] public bool Get(string Called, string Calling, string CallID, int direction)

Sprawdziłem zarówno IIS Express i IIS 8 z uwierzytelnianiem anonimowy i uwierzytelniania systemu Windows jest włączona.

Wygląda na to, że uwierzytelnianie systemu Windows poprzedza inne uwierzytelnianie i nie można go zastąpić.

Czy istnieje sposób, aby to osiągnąć?

Odpowiedz

14

Dodaj to do swojego pliku Web.config. Tutaj mój kontroler nazywa się "WebhookController".

<location path="Webhook"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

See this KB article for more info.

Edit - Erik Jak wspomniano poniżej, w aplikacji MVC nie należy używać web.config <authorization> tagów dla bezpieczeństwa. Zamiast tego użyj atrybutów [Authorize]. Dzięki temu atrybuty [AllowAnonymous] będą działać poprawnie. You can read more about this here.

+0

I nie sądzę, że to będzie pracować dla mnie. To ustawienie jest nadpisywane przez ", a strona internetowa nadal wymaga nazwy użytkownika i hasła, aby uzyskać do niego dostęp. Poza tym używam MVC i takie ustawienia konfiguracyjne w web.config mogą nie zawsze pomóc z powodu routingu. –

+0

To działa dla mnie. Używam również '' z MVC3. Nie mam jednak żadnych specjalnych zasad routingu. Być może będziesz musiał zadzwonić ze ścieżką lokalizacji. –

+0

Daje to drugą szansę - działa. Wygląda na to, że atrybut "AllowAnonymous" nie jest wystarczający w przypadku uwierzytelniania systemu Windows, a tag "location" jest tym, który działa najlepiej. Dzięki za wskazanie mi, co może być właściwym rozwiązaniem problemu! –

3

Przyjęty Odpowiedź wydaje się być nieaktualna, więc ...

W Twojej web.config, usunąć te linie:

<authorization> 
    <deny users="?" /> 
</authorization> 

w oknie Solution Explorer, kliknij swój projekt, a następnie kliknij f4 (lub otwórz eksplorator właściwości). Włącz uwierzytelnianie anonimowe.

Teraz możesz używać atrybutów Authorize i AllowAnonymous. Są całkiem proste, Authorize oznacza, że ​​użytkownik musi mieć autoryzację, aby uzyskać dostęp do akcji lub kontrolera, AllowAnonymous oznacza odwrotnie. Jeśli nieautoryzowany użytkownik spróbuje uzyskać dostęp do kontrolera lub działania z atrybutem Authorize, zostanie przekierowany do strony logowania. Jeśli umieścisz Authorize na kontrolerze, będzie to dotyczyło wszystkich działań kontrolera, oprócz tych z AllowAnonymous.

0

web.config nie należy dotykać zgodnie z oznaczeniem here.

Aby osiągnąć pożądany wynik, należy użyć AllowAnonymous i [Authorize] (a może jakiś niestandardowy atrybut autoryzacji, jeśli to konieczne).

Kroki do wykonania:

  1. Zapewnienie IIS ma zarówno Anonymous Authentication i Windows Authentication skonfigurowany dla strony aplikacji internetowych/web

  2. Wszystkie sterowniki powinny wykorzystywać atrybut [Authorize]. Można to łatwo osiągnąć, jeśli wszystkie dziedziczą ze wspólnej klasy kontrolera (na przykład BaseController/BaseApiController). Np .:

    [Authorize] 
    public class BaseController : System.Web.Mvc.Controller 
    { 
    
    } 
    
    
    [Authorize] 
    public class BaseApiController : System.Web.Http.ApiController 
    { 
    
    } 
    
  3. Dodaj [AllowAnonymous] atrybut do wszystkich działań, które mają być anonimowe. Np .:

    [RoutePrefix("Api/Anonymous")] 
    [Authorize] 
    public class AnonymousController : ApiController 
    { 
        [HttpGet] 
        [Route("GetServiceStatus")] 
        [AllowAnonymous] 
        public string GetServiceStatus() 
        { 
         return "OK"; 
        } 
    } 
    
Powiązane problemy