1

J'ai un projet d'authentification que j'aimerais réutiliser.Comment puis-je faire abstraction du type dépendant du projet de base de base C# en utilisant le cadre d'identité de Microsoft?

J'ai un projet AspNetCore Identity appelé authentification qui est destiné à être un projet d'authentification réutilisable. Si vous avez examiné l'implémentation d'AspNetCore Identity, vous verrez un type appelé UserManager dans lequel l'utilisateur de l'application est la classe dans laquelle vous stockez votre implémentation de l'utilisateur dans la table de base de données AspNetUsers.

public class ApplicationUser : IdentityUser 
{ 
} 

Le problème que j'ai est qu'il ya un contrôleur dans ce projet d'authentification isolé appelé AccountController qui détient toute la connexion/déconnexion, l'enregistrement, et d'autres actions de compte connexes. Je souhaite extraire l'utilisateur de l'application de la classe de ce projet afin que je puisse le modifier en fonction des besoins du projet pour des solutions multiples.

Le projet d'authentification a une classe de démarrage qui est initiée comme suit à l'intérieur du projet dans lequel il est utilisé:

authenticationStartUp.ConfigureServices<ApplicationUser, MyDatabase> 
     (services, Configuration); 

Comme vous pouvez le voir, le projet abonnée ajoute sa propre mise en œuvre du ApplicationUser. Ensuite, vient la configuration de l'identité qui fait référence à TApplicationUser dans l'appel services.AddIdentity. Malheureusement, ceci se décompose maintenant dans le AccountController qui utilise le service injecté. Comment, le TApplicationUser peut-il être ajouté au contrôleur.

public class AccountController : Controller 
{ 
    private readonly UserManager<TApplicationUser> _userManager; 

    public AccountController(UserManager<TApplicationUser> userManager) 
    { 
     _userManager = userManager; 
    } 
} 

Ceci est évidemment brisé car il n'y a pas d'utilitaire d'application TApplication. De plus, si j'ajoute le TApplicationUser comme suit, le contrôleur n'est plus résolu et rien ne se passe.

public class AccountController<TApplicationUser> : Controller 
    where TApplicationUser : IdentityUser 
{ 
    private readonly UserManager<TApplicationUser> _userManager; 

    public AccountController(UserManager<TApplicationUser> userManager) 
    { 
     _userManager = userManager; 
    } 
} 

est-il de toute façon à obtenir contrôleur d'application à toujours résolu avec les paramètres de type inclus?

Et aussi, j'ai trouvé un autre problème en ce que même si j'ajoute le paramètre de type dans la classe de base comment serai-je capable d'ajouter le paramètre de type dans les vues qui utilisent TApplicationUser. Voici un exemple

vue intégrée dans le projet d'authentification

@* TApplicationUser obviously doesn't resolve *@ 
@inject SignInManager<TApplicationUser> SignInManager 
@{ 
    var loginProviders = SignInManager.GetExternalAuthenticationSchemes().ToList(); 
    if (loginProviders.Count == 0) 
    { 
     <div> 
      <p> 
       There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a> 
       for details on setting up this ASP.NET application to support logging in via external services. 
      </p> 
     </div> 
    } 
    else 
    { 
     <form asp-controller="Account" asp-action="ExternalLogin" asp-route-returnurl="@ViewData["ReturnUrl"]" method="post" class="form-horizontal"> 
      <div> 
       <p> 
        @foreach (var provider in loginProviders) 
        { 
         <button type="submit" class="btn btn-default" name="provider" value="@provider.AuthenticationScheme" title="Log in using your @provider.DisplayName account">@provider.AuthenticationScheme</button> 
        } 
       </p> 
      </div> 
     </form> 
    } 
} 
+0

Avoir le contrôleur générique en tant que contrôleur de base – Nkosi

+0

Et que dois-je transmettre en tant que paramètre de type basecontroller? – jwize

+0

L'utilisateur de l'application du projet utilisant – Nkosi

Répondre

2

Demandez le contrôleur générique en tant que contrôleur de base qui vit dans le projet réutilisable

public abstract class AccountControllerBase<TApplicationUser> : Controller 
    where TApplicationUser : IdentityUser { 
    protected readonly UserManager<TApplicationUser> _userManager; 

    protected AccountController(UserManager<TApplicationUser> userManager) { 
     _userManager = userManager; 
    } 
} 

La classe en utilisant/projet dériverait à partir du contrôleur de base et définir l'argument générique

public class AccountController : AccountControllerBase<ApplicationUser> { 

    public AccountController(UserManager<ApplicationUser> userManager) 
     : base(userManager) { } 

} 
+0

Cela fonctionne mais il y a un petit problème en ce que RazorView utilise @inject SignInManager <évidemment aucun paramètre de type ici> SignInManager. Existe-t-il un moyen de résoudre cette limitation. Depuis le gestionnaire de connexion est utilisé dans les vues? – jwize

+0

Ok, vous devrez clarifier cette partie pour moi. Pourquoi et comment le gestionnaire est-il utilisé dans la vue? Le contrôleur remplit un ViewModel et le transmet à la vue. Je ne comprends donc pas très bien ce que vous voulez dire. – Nkosi

+0

J'ai mis à jour le message original avec une partie du code. Ce code est fourni avec l'implémentation Microsoft Identity que j'utilise. – jwize