Authentification basée sur le rôle dans le nouveau modèle internet MVC 4 utilisant simplemembership

j'aime la nouvelle simplemembership fonction MVC 4 internet modèle avec des liens à OAuth pour les connexions externes de VS 2012 RTM. Pour la plupart des fonctionnalités d'authentification fonctionnent. Cependant, même après avoir passé plus de 8 heures sur ce sujet, Je ne suis pas en mesure de mettre en œuvre des rôles basés sur l'autorisation de travailler sur mes contrôleurs. SimpleMembership s'avère être tout sauf simple.

j'ai cherché stackoverflow, j'ai cherché sur Google et j'ai lu le dernier par John Galloway , essayé de nombreuses suggestions et n'ont toujours pas été en mesure de répondre à cette question. Tout a commencé avec une erreur de connexion Sql et ne pouvait pas comprendre pourquoi quand la chaîne de connexion et tout le reste était bonne. Il a fallu de nombreuses heures pour comprendre que la classe it is Roles est à l'origine du problème.

l'attribut [Authorize] sur controllers fonctionne comme avant pour l'authentification de base. Mais chaque fois que j'essaie d'utiliser les rôles, cela donne une erreur de connexion sql (parce qu'il revient à l'ancien DefaultRolesProvider qui essaie de se connecter au fichier aspnetdb par défaut de SqlExpress et échoue). Donc quelque chose comme:

[Authorize(Roles="admin")]

ne fonctionne pas. Ça marchera si je retourne à l'ancienne asp.net fournisseurs d'adhésion, mais ensuite je perds les tables de base de données simples, la confirmation et la récupération des bases de token, plus de hachage de mot de passe sécurisé et plus important encore logins externes via OAuth.

la seule chose qui fonctionne à l'intérieur du code et des vues de rasoir est

User.IsInRole("admin")

qui est OK pour les éléments de menu et tels, mais très encombrant à mettre en œuvre à l'intérieur de chaque Action simple dans le contrôleur (et je n'aime pas qu'il teste seulement pour un rôle unique à la fois).

j'apprécierai beaucoup tout conseil pour résoudre cette question.

53
demandé sur Ahmed 2012-09-04 09:21:11

2 réponses

trouvé une réponse ici par Mehdi Golchin qui semble prendre soin de:

[Authorize(Roles="admin,editor,publisher")]

si j'ajoute cela au contrôleur d'origine:

 [InitializeSimpleMembership]

parce que cet attribut est sur le Controller comptes, La base de données SimpleMembership n'est initialisée qu'après la première utilisation du controller comptes comme login/register. Même si l'utilisateur courant est connecté à partir du cookie, La base de données n'est pas initialisé et donc il lance une erreur. Une solution est de mettre cet attribut sur le contrôleur maison qui est appelé lorsque je lance mon site web. Mais, alors il doit être placé sur chaque contrôleur parce que je vérifie les rôles et j'affiche différents éléments de menu basés sur le rôle.

c'est une mauvaise conception car la base de données doit être initialisée sur L'App_Start et non pas lors de sa première utilisation.

j'ai essayé de mettre

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

dans le Global.asax Application_Start() , et il s'occupe de la vérification des rôles dans les éléments de menu en utilisant User.IsInRole("admin") , mais ensuite jeter l'erreur dans n'importe quel contrôleur avec [Authorize(Roles="admin")] attribut, même avec l'attribut supplémentaire [InitializeSimpleMembership] est appliquée.

donc la solution est de mettre `[InitializeSimpleMembership] sur tous les contrôleurs comme un utilisateur peut d'abord atterrir sur n'importe quelle page en utilisant des liens externes.

il ne peut toujours pas se figurer comment initialiser le SimpleRolesProvider classe de faire plus de la gestion de rôle au lieu de juste User.IsInRole() .

ces choses fonctionnent mieux sur le site webmatrix et évidemment le port ot MVC n'est pas complet. Il entre en conflit et se confond avec le défaut asp.net fournisseurs de membres.

EDIT OK je ne pensais pas que le filtre [InitializeSimpleMembership] pourrait être appliqué globalement en mettant cette ligne dans le dossier FilterConfig.cs dans le dossier App_Start:

filters.Add(new InitializeSimpleMembershipAttribute());

qui s'occupe de ce problème. Maintenant besoin d'une solution pour l'initialisation SimpleRolesProvider ou bien je vais devoir écrire mon propre fournisseur de rôles.

mise à jour:

Ce post par Scott Allen a résolu tous mes problèmes.

en incluant ceci dans web.config:

<roleManager enabled="true" defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleRoleProvider,               WebMatrix.WebData"/>
  </providers>      
</roleManager>
<membership defaultProvider="simple">
  <providers>
    <clear/>
    <add name="simple" type="WebMatrix.WebData.SimpleMembershipProvider,                          WebMatrix.WebData"/>
  </providers>
</membership>

toutes les méthodes de rôles et de membres les classes deviennent disponibles et peuvent être initialisées en code comme suit:

var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;
69
répondu Ahmed 2017-05-23 11:53:25

avait le même problème quand je déplaçais mon application web de VS2010/MVC3 à VS2012/MVC4.

et ne pouvait pas faire fonctionner [InitializeSimpleMembership].

a découvert que l'ajout de ceci à votre web.config ne le truc:

  <appSettings>
    <add key="enableSimpleMembership" value="false" />
  </appSettings>

et tout fonctionne comme avant.

6
répondu keun 2013-08-07 10:30:58