Autorisation d'Url avec MVC et ASP.NET L'identité

je veux sécuriser des dossiers et des ressources spécifiques dans mon application qui sont en dehors des routes pour mon application mvc. Je veux que ces ressources ne seront disponible que pour les utilisateurs authentifiés ( quel rôle n'est pas de conséquence tant qu'ils sont authentifiés).

Initialement, il semblait que l' UrlAuthorizationModule serait la réponse. J'ai suivi cet article, la Compréhension de l'Autorisation d'URL IIS 7.0, et je peux obtenir le module à travailler dans le sens où il répond aux éléments de configuration dans le web.config.

Mon problème actuel est que je penser c'est d'édicter des règles basées sur l'utilisateur anonyme dans IIS et non pas l'utilisateur authentifié dans asp.net identité.

Environnement D'Essai

j'utilise un standard html fichier de test au lieu d'essayer de charger un script car il serait également chargé à l'extérieur du pipeline MVC.

  • Visual Studio 2015.
    • par défaut .net 4.6.2 projet web
    • modèle MVC
    • Authentification = Individual User Accounts
  • IIS 8 (pour les tests en dehors de Visual Studio)
    • authentification - > authentification anonyme (activée)

Ajouter web.config

<configuration>
...
<location path="Data">
  <system.webServer>
    <security>
      <authorization>
        <clear/>
        <add accessType="Deny" users="*"/>
        <add accessType="Allow" users="?"/>
      </authorization>
    </security>
  </system.webServer>
</location>
...
</configuration>

ajouter à la structure des dossiers

/Data/Protected.html // this file just has some basic Hello World content to display so you can see if it is loaded or not.

observé Résultats

  • avec cette configuration tout dans le Data le chemin est toujours nié, peu importe que l'utilisateur soit authentifié ou non.
  • la même chose est vraie si je change les 2 lignes pour Deny et Allow dans le web.config.
  • si je supprime complètement la ligne avec Deny ensuite, l'accès est toujours possible, même lorsque l'utilisateur n'est pas authentifié.
  • si j'ajoute un rôle et utilise roles avec le nom du rôle au lieu de users attribuer le rôle est complètement ignoré.

Et Maintenant?

Ce qui me manque? Comment puis-je obtenir de l' Autorisation Url module pour travailler avec MVC / WebAPI et ASP.NET identitéIndividual user accounts ou est-ce tout simplement pas faisable?

je suis ouvert à d'autres idées, peut-être que la réponse est d'écrire un custom HttpModule ou <!--17?


notes

Pourquoi & Détails

ces ressources sont des fichiers javascript, en bref, seule une partie des scripts devrait être disponible pour les utilisateurs non authentifiés. Il y a 2 répertoires à la racine, l'un pour la authentifié partie de l'application et un pour les non-authentifié partie de l'application. La raison pour cela n'a rien à voir avec l'autorisation de l'utilisateur ou la sécurité dans l'application, il est de limiter la surface exposée de l'application à des demandes non authentifiées.

13
demandé sur Legends 2017-02-27 16:09:56

1 réponses

[TL;DR;]

Accédez à "Complète de la racine web.config" pour voir le besoin web.config du programme d'installation.

testez ceci en mode incognito pour éviter les problèmes de mise en cache du navigateur! Et utiliser Ctrl+F5 parce que les scripts et les fichiers html sont mis en cache.

d'Abord refuser l'accès à tous les utilisateurs anonymes dans la racine web.config.

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

le web.config ici permet un dossier public accessibilité. Ce dossier, dans mon exemple ici, est appelé css et se trouve à la racine de l'application MVC. Pour le dossier css j'ajoute l'autorisation suivante au Web racine.config:

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

Vous pouvez ajouter plus de ces emplacement des chemins si vous voulez plus de dossiers publics.

alors que tous les autres fichiers ne seront pas accessibles tant que l'utilisateur ne se connecte pas, le dossier css et son contenu seront toujours accessibles.

j'ai aussi ajouté une gestionnaire de fichiers statique vers le Web racine.config,ceci est critique car vous voulez que la requête soit gérée par le asp.net pipeline for the specific file type (s):

<handlers>
    <add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
</handlers> 

Complet de la racine web.config

<system.web>
    <authentication mode="None" />
    <authorization>
        <deny users="?"/>        
    </authorization>
    <compilation debug="true" targetFramework="4.6.2" />
    <httpRuntime targetFramework="4.6.2" />
</system.web>
<location path="css">
    <system.web>
        <authorization>          
            <allow users="*"/>
        </authorization>
    </system.web>
</location>
<system.webServer>
    <modules>
        <remove name="FormsAuthentication" />           
        <remove  name="UrlAuthorization" />
        <add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"  />     
    </modules>
    <handlers>
        <add name="HtmlScriptHandler" path="*.html" verb="*" preCondition="integratedMode" type="System.Web.StaticFileHandler" />
    </handlers>      
</system.webServer>

ASP.NET par défaut, les règles allow et deny s'appliqueront uniquement aux fichiers traités par le gestionnaire géré. Les fichiers statiques ne sont pas gérés par le gestionnaire géré.

vous pouvez également définir: ( ne faites pas cela, si ce n'est pas vraiment nécessaire!)

 <modules runAllManagedModulesForAllRequests="true">

runAllManagedModulesForAllRequests="true" tous les modules HTTP s'exécuteront sur chaque requête, pas seulement sur les requêtes gérées (par exemple .aspx, ashx). Cela signifie que les modules s'exécutent sur chaque .jpg,.GIF., CSS., HTML. ,PDF. ,.. demande.


Une chose importante

Vous n'avez pas à ajouter L'UrlAuthorizationModule à la section modules car il fait déjà partie de la ASP.NET pipeline. Ce les moyens, il ne fonctionnera que pour les fichiers gérés, pas statique!

si vous supprimez maintenant puis rajoutez L'UrlAuthorizationModule à la section modules, il s'exécutera sous condition " integratedMode "et non plus sous" managedHandler"! Et ont donc accès à des fichiers statiques.

<remove  name="UrlAuthorization" />
<add  name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />


Si vous définissez la condition préalable à gérer: <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="managedHandler" />, alors L'UrlAuthorizationModule ne restreindra plus l'accès aux fichiers statiques.

Vous vous pouvez tester cela en accédant à un fichier de script dans le dossier scripts avec succès pendant que vous êtes déconnecté. Cliquez sur Ctrl+F5 pour vous assurer d'obtenir une nouvelle copie du fichier script.


différence entre ASP.NET UrlAuthorization < -- > IIS URL Authorization

il est important de garder à l'esprit que la condition préalable managedHandler is on the ASP.NET module D'autorisation D'URL. La condition préalable vous dit que L'URL module d'autorisation n'est invoqué que lorsque le code handles la requête est associée au code géré, généralement un.aspx ou .asmx page. L'autorisation D'URL IIS, d'autre part, s'applique à tous contenu. Vous pouvez supprimer la condition préalable managedHandler ASP.NET module D'autorisation Url. Il est là pour empêcher une performance pénalité vous devez payer lorsque chaque demande (comme une demande .html ou .pages jpg) devraient passer par géré code.

P. S.: Certains web.les attributs de configuration sont sensibles à la casse!

12
répondu Legends 2017-03-03 15:16:18