2011-10-18 8 views
12

Mam jednego kontrolera, który renderuje strony w wewnętrznej aplikacji sieci Web, która wymaga uwierzytelnienia systemu Windows. Istnieje drugi kontroler używany do zapytań opartych na JSON do systemu, które NIE muszą być uwierzytelniane w systemie Windows? Czy to jest możliwe? Wygląda na to, że w tej chwili udało mi się zrobić tylko jedno lub drugie.MVC3: Czy jeden kontroler wymaga uwierzytelniania systemu Windows, a drugi umożliwia anonimowe?

Wszelkie sugestie?

+1

„tylko był w stanie wykonać jedną lub drugą stronę” jak dokładnie to zrobiłeś? – bzlm

+0

Jak dokładnie włączasz uwierzytelnianie systemu Windows? – gideon

+0

Ustawienia IIS mają włączone uwierzytelnianie systemu Windows i umożliwiają także anonimowe. Web.config ma . Dodałem atrybut [Authorize] do kontrolera, którego potrzebowałem chronić, i zostawiłem go kontrolerowi, który chciałem ujawnić. – Shawn

Odpowiedz

6

Tak. Na podstawie tego, co uwierzytelniania wybierzesz, możesz ozdobić metodę działania kontrolera za z Authorize

Ten artykuł przedstawia dokładnie to, czego szukasz: http://www.asp.net/mvc/tutorials/authenticating-users-with-windows-authentication-cs

Z artykułu „Na przykład, kontroler Home w Opisie 1 udostępnia trzy akcje o nazwie Index(), CompanySecrets() i StephenSecrets() .Każdy może wywołać działanie Index(), jednak tylko członkowie grupy lokalnych menedżerów Windows mogą wywołać akcję CompanySecrets() .Ostatnie tylko system Windows użytkownik domeny o nazwie Stephen (w domenie Redmond) może wywołać akcję StephenSecrets(). "

0

tak można sobie z tym poradzić z AuthorizeAttribute

Tak na przykład w prosty kontroler obrotów chcesz tylko autoryzowanym użytkownikom na dostęp do działania ChangePassword

[Authorize] 
    public ActionResult ChangePassword() 
    { 
     // your code here 
    } 
8

Mamy kilka aplikacji, które muszą zrobić dokładnie to. Często nasze aplikacje są zablokowane w pliku web.config:

<authentication mode="Windows"/> 
<authorization> 
    <allow roles="DOMAIN\GroupNameHere"/> 
    <deny users="?"/> 
</authorization> 
<location path="ApiControllerName"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

Jednak trzeba jeszcze wyłączyć uwierzytelnianie systemu Windows API dla tego kontrolera. Można to zrobić poprzez edycję pliku applicationHost.config na serwerze IIS i dodaje:

<location path="Default Web Site/ApplicationName/ApiControllerName"> 
    <system.webServer> 
     <security> 
      <authentication> 
       <anonymousAuthentication enabled="true" /> 
       <windowsAuthentication enabled="false" /> 
      </authentication> 
     </security> 
    </system.webServer> 
</location> 

Ten skrypt PowerShell zrobi to za ciebie:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Web.Administration") 

$applicationLocationPath = "Default Web Site/ApplicationName/ApiControllerName" 

$oIIS = new-object Microsoft.Web.Administration.ServerManager 
$oGlobalConfig = $oIIS.GetApplicationHostConfiguration() 

$oSection = $oGlobalConfig.GetSection("system.webServer/security/authentication/anonymousAuthentication", $applicationLocationPath) 
$oSection.SetAttributeValue("enabled", "True") 
$oSection = $oGlobalConfig.GetSection("system.webServer/security/authentication/windowsAuthentication", $applicationLocationPath) 
$oSection.SetAttributeValue("enabled", "False") 

$oIIS.CommitChanges() 
+1

Ty, Sir, uratowałeś mi życie! – 130nk3r5

Powiązane problemy