2015-12-02 4 views
0

J'ai implémenté un principe personnalisé pour l'identité ASP.Net, mais lorsque j'essaie d'obtenir principe personnalisé à partir HttpContext.Current.User Je reçois l'exception suivante:Personnalisé ASP.Net Principe - Impossible de convertir un objet de type 'System.Security.Principal.GenericPrincipal' en type 'Business.ICustomPrincipal'

Impossible de jeter l'objet de type 'System.Security.Principal.GenericPrincipal' taper 'VenuePortal.Business.ICustomPrincipal'.

Ma mise en œuvre est:

public interface ICustomPrincipal : IPrincipal 
{ 
    int UserID { get; set; } 
    string UserName { get; set; } 
    string Email { get; set; } 
    string AuthCode { get; set; } 
    string Title { get; set; } 
} 

public class CustomPrincipal : ICustomPrincipal 
{ 
    public int UserID { get; set; } 
    public string UserName { get; set; } 
    public string Email { get; set; } 
    public string AuthCode { get; set; } 
    public string Title { get; set; } 
    public IIdentity Identity { get; private set; } 
    public bool IsInRole(string role) { return false; } 
    public CustomPrincipal(string email) 
    { 
     Identity = new GenericIdentity(email); 
    } 
} 

L'erreur jette dans ce Ninject contraignant:

kernel.Bind<ICustomPrincipal>().ToMethod(context => (ICustomPrincipal)HttpContext.Current.User).InRequestScope(); 

J'ai cette même solution de travail dans un autre (plus) projet donc je devine là-bas est une sorte de changement de cadre qui affecte cela? HttpContext.Current.User semble toujours retourner un IPrinciple alors ne devrait pas tout cela fonctionne?

Toute aide très appréciée.

Répondre

1

HttpContext.Current.User est en effet implémente IPrincipal et l'objet derrière cela est généralement GenericPrincipal si vous utilisez le framework Asp.Net Identity. Et GenericPrincipal fait partie du framework .Net et ne peut pas implémenter votre interface ICustomPrincipal.

Si vous cherchez à faire des méthodes d'extension sur User objet d'extraire des données supplémentaires, il existe peu d'approches différentes (l'utilisation des revendications est l'un d'entre eux). Mais créer votre propre CustomPrincipal est une chose d'un passé maintenant il existe des moyens plus faciles de le faire.

+0

Vraiment, c'est intéressant. Je vais devoir faire des recherches. Merci pour la réponse. – Simon

+0

C'est intéressant, pourrais-je vous suggérer de jeter un œil sur ce que pourraient être les autres approches? –

0

J'ai découvert que j'ai trouvé deux solutions à ce cela est causé lorsque l'utilisateur n'est pas connecté:

  1. Ne pas essayer d'injecter l'utilisateur actuel quand ils ne sont pas enregistrés dans (tout à fait. simple dans cette instance car je viens de retirer la propriété de mon LoginController
  2. Injecter une classe usine qui gère le renvoi de l'utilisateur actuel Ninject est toujours capable d'instancier et d'injecter ceci, que l'utilisateur soit ou non connecté. La classe d'usine gère les exceptions nulles, etc.

J'espère que cela aide quelqu'un d'autre.