Exclut les biens de WebApi OData (EF) réponse en c#
Je travaille avec un WebApi projet en C# (EF premier code) et je suis en utilisant OData.
J'ai un modèle Utilisateur avec l'Id, Nom, Prénom, Email, Mot de passe.
Dans le contrôleur, par exemple j'ai ce code:
//GET: odata/Users
[EnableQuery]
public IQueryable<User> GetUsers()
{
return db.Users;
}
Si je l'appelle /odata/Utilisateurs, je vais obtenir toutes les données: Id, Nom, Prénom, Email, Mot de passe.
Comment puis-je exclure un Mot de passe à partir des résultats, mais de mettre à disposition dans le contrôleur pour faire des requêtes Linq?
OriginalL'auteur Martín | 2015-01-05
Vous devez vous connecter pour publier un commentaire.
Je suis un peu en retard pour le sujet, mais je pense que cela pourrait vous aider.
Je suppose que vous souhaitez crypter le mot de passe à des fins de stockage. Avez-vous regardé à l'aide d'un odata d'action pour définir le mot de passe? À l'aide d'une action permet d'ignorer la propriété de mot de passe lors de la configuration de votre entités pendant encore d'exposer une méthode propre à l'utilisateur final pour mettre à jour le mot de passe.
première: ignorer le mot de passe de propriété
deuxième: ajouter votre odata action
Puis ajouter la méthode SetPassword à votre UserInfoController.
Je suppose que je suis confus quant à ce que vous entendez par "disponible dans la GED". Cette solution vous permet d'accéder à la propriété de mot de passe dans l'api et le supprime de la charge utile.
J'ai juste besoin d'avoir accès au mot de passe à l'intérieur d'une méthode dans le contrôleur, mais je ne veux pas le montrer dans la réponse (quand je reviens à l'objet de l'Utilisateur). Quand je dis que j'ai besoin de cette disposition dans la GED je dis juste que j'ai besoin de travailler avec le mot de passe dans le contrôleur (travailler avec des requêtes linq, etc).
C'est la bonne solution, de l'omi. Comme je comprends votre objectif, vous voulez travailler avec
User
dans votre contrôleur et pas besoin de l'appointUserInfo
mappage de classe. Avec cette solution, vous pouvez. DéposerUserInfo
et exposerUser
directement. Puis appliquer @RickWillis solution sur leUser
entité, le résultat sera le Mot de passe ne soient pas exposés dans le OData charge utile.OriginalL'auteur Rick Willis
Ajouter [NotMapped] l'attribut de la propriété de Mot de passe dans la Classe Utilisateur comme suit:
Maya solution est d'ignorer la propriété de requête OData, mais encore de la sérialisation. Merci!
OriginalL'auteur Maya
Il pourrait être un peu tard, mais une solution élégante serait d'ajouter des QueryableSelectAttribute et puis tout simplement la liste des champs que vous souhaitez utiliser sur le service-côté. Dans votre cas, il va ressembler à quelque chose comme ceci:
Et dans le contrôleur, il suffit d'ajouter l'attribut avec les propriétés souhaitées:
Et c'est tout!
Bien sûr, le même principe peut être appliqué pour un custom
QueryableExpandAttribute
.c'est la seule chose qui a fonctionné pour moi. Toutefois, malheureusement, il supprime le "$select" clause de l'URI de la demande elle-même. Donc, si je veux filtrer les champs uniquement de Nom et de Nom, il sera de retour TOUS les champs Nom,Prénom,e-Mail - de toute façon 🙁
Un autre inconvénient est que chaque fois que j'ajoute une nouvelle propriété à mon DTO, j'ai du modifier son [QueryableSelect("")] l'attribut de chaque méthode dans mon TableController.
OriginalL'auteur Corneliu Serediuc
L'ignorer. De Les Conseils de sécurité pour ASP.NET Web API 2 OData:
Qu'est-ce que cela signifie? Entity Framework devrait vous permettre de l'interroger.
Si vous excluez la propriété de EDM cela ne va pas apparaître dans le OBTENIR la réponse (c'est OK), mais si vous essayez par exemple de faire un POST pour créer un nouvel Utilisateur dans l'API, le mot de passe sera pas reçu parce que le bien ne fait pas partie de l'EDM. C'est pourquoi j'ai besoin de cacher le mot de passe uniquement pour les réponses, mais pas toutes les EDM (je pense que la seule solution est de créer une nouvelle classe avec les paramètres que j'ai besoin d'uniquement pour les réponses).
OriginalL'auteur ta.speot.is
Ce que vous devez faire est de faire un odata contrôleur qui renvoie prévu un sous-ensemble de l'entité d'origine.
... alors les deux Odata Contrôleurs de un pour FulLData, un pour SubsetData (sécurité différents),
Ce code suppose que vous retourner public IQueryable<EntityName> Query() de votre base de données de contexte. En d'autres termes dans la Requête() faire une requête sur vous dbcontext comme contexte.Set<EntityName>().AsQueryable();
OriginalL'auteur
Vous déjà essayé cela?
Juste mettre à jour la propriété.
OriginalL'auteur Igor Quirino
Nous pouvons profiter de la ConventionModelBuilder et l'utilisation DataContract/DataMember pour activer explicitement les propriétés d'être dans le EdmModel.
Noter que cela n'affecte pas la EntityFramework, car nous ne sommes pas à l'aide de la [NotMapped] attribut (sauf si vous ne voulez pas qu'il en soit le modèle)
Cela a l'avantage de garder toute la logique de mapping dans un endroit dans votre projet
OriginalL'auteur Paul Hatcher
J'ai fait un métier et solution temporaire à ce problème (qui n'est pas la meilleure solution car UserInfo n'est pas un type d'entité et ne pas supporter $select ou $expand).
J'ai créé un nouveau modèle appelé UserInfo juste avec les propriétés dont j'ai besoin (à part de l'Utilisateur):
Puis j'ai changé la méthode dans le contrôleur:
OriginalL'auteur Martín
Vous pouvez créer une nouvelle vue dans la DB avec les seules données dont vous avez besoin. Puis définissez EntitySetRights.Aucune pour la table des Utilisateurs et de créer des relations nécessaires pour créé vue.
Maintenant, vous pouvez faire commun odata requêtes (GET odata/UsersFromView) et d'utilisateurs de données sans mot de passe. Post de demande que vous pouvez faire à l'aide de table des Utilisateurs.
OriginalL'auteur DominGez
Rien d'autre n'a fonctionné pour moi, donc voici une solution élégante.
Utiliser le
HideSensitiveProperties()
méthode d'extension dans votreTableController
comme ça.Bien que ce ne sera pas supprimer le nom de la propriété à partir de la réponse, mais il donne sa valeur à
null
.Ici
ModelBase
est la classe de base pour tous les Dto.OriginalL'auteur Artemious
Vous ne devriez pas interroger votre modèle de Domaine directement dans le contrôleur. Au lieu de cela, créer un QueryModel DTO que des cartes pour le modèle de Domaine.
Vous pouvez lire plus au sujet de ces concepts dans le DDD et le CQRS
OriginalL'auteur LastTribunal
utilisation Automapper
Manque un ToList dans le milieu, vérifier maintenant
J'ai changé le code et l'erreur a été résolu, mais toujours obtenir le mot de passe dans la réponse Odata.
Essayez-les avec de l'Ignorer au lieu de UseDestination valeur (j'ai mis à jour ma réponse)
Merci mais le mot de passe est toujours affiché dans la réponse.
OriginalL'auteur dariogriffo