53 votes

Basé sur un rôle d'authentification dans le nouveau MVC 4 Internet modèle à l'aide de 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 sont de travail. Cependant, même après avoir passé plus de 8 heures sur ce, je suis incapable de mettre en œuvre basé sur les rôles d'autorisation de travaux sur mon contrôleurs. SimpleMembership s'avère être tout sauf simple.

J'ai cherché sur stackoverflow, googlé et avoir lu la dernière par Jean Galloway, essayé de nombreuses suggestions et n'ont toujours pas été en mesure de le cas resovle cette question. Tout a commencé avec Sql erreur de connexion et ne pouvait pas comprendre pourquoi, lorsque la chaîne de connexion et tout le reste était bon. Il a fallu de nombreuses heures pour comprendre que c'est les Rôles de la classe qui est à l'origine du problème.

L'attribut [Authorize] sur les contrôleurs fonctionne comme avant pour l'authentification de base. Mais chaque fois que j'essaie d'utiliser les Rôles de donner de connexion sql erreur (parce qu'il revient à l'ancien DefaultRolesProvider qui tente de se connecter à défaut SqlExpress aspnetdb fichier et échoue). Donc quelque chose comme:

[Authorize(Roles="admin")]

ne fonctionne pas. Cela ne fonctionne pas si je vais revenir à l'ancienne asp.net les fournisseurs d'appartenance, mais je perds la simple base de données, tables, jetons les bases de la confirmation et de la récupération, plus sûr de hachage de mot de passe et surtout externe connexions via le protocole OAuth.

La seule chose qui fonctionne à l'intérieur de code et de rasoir vues

User.IsInRole("admin")

qui est OK pour les éléments de menu et, mais ver lourde à mettre en œuvre à l'intérieur de chaque Action dans le contrôleur (et je n'aime pas qu'il ne teste que pour un seul rôle à la fois).

J'apprécie beaucoup tous les conseils pour le cas resovle cette question.

69voto

Ahmed Points 921

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

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

Si j'ai aussi ajouter ceci à la maison de contrôleur:

 [InitializeSimpleMembership]

Parce que cet attribut est sur les Comptes de contrôleur, SimpleMembership initialiser la base de données est seulement après la première utilisation des comptes contrôleur comme login/s'inscrire. Même si l'utilisateur en cours seront consignées dans le cookie, la base de données n'est pas initialisé et donc, il renvoie une erreur. Une solution est de mettre cet attribut sur le contrôleur de la maison qui est appelée lorsque je lance mon Site web. Mais, ensuite, il doit être placé sur chaque contrôleur parce que j'ai vérifier les rôles et afficher les différents éléments de menu en fonction de leur rôle.

C'est une mauvaise conception de la base de données doit être initialisé sur le App_Start et non pas lors de la première utilisation.

J'ai essayé de mettre

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

dans l' Global.asax Application_Start(), et il prend soin de rôle de contrôle dans les éléments de menu à l'aide de User.IsInRole("admin"), mais de jeter erreur dans le contrôleur [Authorize(Roles="admin")] d'attribut, même avec de l'attribut additionnel [InitializeSimpleMembership] est appliquée.

Donc, pour l'instant, la solution est de mettre " [InitializeSimpleMembership] sur tous les contrôleurs en tant qu'utilisateur peut d'abord atterrir sur n'importe quelle page à l'aide de liens externes.

Il ne peut toujours pas comprendre comment initialiser le SimpleRolesProvider de classe à n'en plus du rôle de gestion au lieu de simplement en User.IsInRole().

Ces choses ne fonctionnent mieux dans le webmatrix pages web du site et, évidemment, le port ot MVC n'est pas complète. Il est en conflit et se confond avec la valeur par défaut asp.net les fournisseurs d'appartenance.

MODIFIER OK je ne pensais pas [InitializeSimpleMembership] filtre peut être appliqué à l'échelle mondiale en mettant cette ligne dans l' FilterConfig.cs dans le App_Start dossier:

filters.Add(new InitializeSimpleMembershipAttribute());

Qui prend soin de ce problème. Maintenant besoin d'une solution pour SimpleRolesProvider l'initialisation ou de la chose, je dois écrire mon propre rôle de fournisseur.

Mise à JOUR:

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

En incluant dans le 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 les catégories de Membres sont disponibles et peuvent être initialisées dans le code comme suit:

var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;

6voto

keun Points 91

Eu le même problème quand je bouge de mon application web de VS2010/MVC3 pour VS2012/MVC4.

Et couldnt get [InitializeSimpleMembership] de travailler.

Découvert qu'en ajoutant ceci à votre site web.config fait le truc:

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

Et tout fonctionne bien comme il le faisait avant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X