J'essaie de créer une petite application de démonstration de commerce électronique à l'aide de l'API .NET COE 3.1 avec Identity Server 4.
startup.cs (démo. Projet d'auth) strong> p>
config.cs (projet Demo.Auth) strong> p>
p>
Startup.cs (Projet API) P> [Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = Summaries[rng.Next(Summaries.Length)]
})
.ToArray();
}
}
3 Réponses :
La responsabilité de la création et de la maintenance des utilisateurs est du serveur d'authentification. P>
où je devrais mettre la fonctionnalité de connexion et enregistrez P> blockQuote>
Donc, le projet Identity Server contiendrait des points d'extrémité tels que le registre, la connexion, le mot de passe oublié, etc. P>
Comment puis-je ajouter les utilisateurs à ma base de données et authentifier l'utilisateur de la base de données et non le test. p> blockQuote>
Core Microsoft Identity Strong> P>
Vous pouvez mettre en œuvre Microsoft Identity Core Strong> qui fournit toutes les fonctionnalités liées à la gestion de compte. Et il y a un support intégré à celui-ci dans l'ItalyServer4. P>
De cette façon, vous n'auriez pas à vous soucier du code ou de la base de données. P>
Remarque: le noyau d'identité Microsoft fait beaucoup de choses sous la hotte afin que vous ne puissiez pas comprendre comment cela fonctionne avec IdentityServer4. p> blockQuote>
Vous pouvez trouver le code exemple de ici A> (Open StartUp.Cs) et de la documentation à partir de ici . < / fort> p>
Vous pouvez également jeter un coup d'œil à Cette Série YouTube à codage en ligne . p>
référentiel utilisateur personnalisé strong> p>
Si vous souhaitez valider les utilisateurs sans utiliser Microsoft Identity Core Cordial, vous pouvez implémenter IRESOURCEWOWERPASSWordValidator Interface, vous pouvez trouver un code d'exemple ici et blog de ici . P>
Dans le flux de ressourcesSOWNERPASSWROD, vous pouvez conserver votre enregistrement et connecter la fonctionnalité à la clientèle et vous pouvez valider l'utilisateur à l'utilisateur de la base de données.
Vous devez implémenter votre utilisateur personnalisé pour la validation de l'utilisateur et l'ajout de revendications de la base de données. Modifier le code de démarrage Comme ci-dessous, l'USEREREPOSITORY Classe représente la communication de la base de données pour authentifier l'utilisateur et obtenir des réclamations à partir de la base de données: P>
Médiez la méthode de configuration de mise à jour pour la configuration d'identité: p>
public static class CustomIdentityServerBuilderExtensions { public static IIdentityServerBuilder AddCustomUserStore(this IIdentityServerBuilder builder) { builder.AddProfileService<UserProfileService>(); builder.AddResourceOwnerValidator<UserResourceOwnerPasswordValidator>(); return builder; } } public class UserProfileService : IProfileService { public async Task GetProfileDataAsync(ProfileDataRequestContext context) { UserRepository userRepository=new UserRepository(); var user = userRepository.GetUserById(int.Parse(context.Subject.GetSubjectId())); if (user != null) { var userTokenModel = _mapper.Map<UserTokenModel>(user); var claims = new List<Claim>(); claims.Add(new Claim("UserId", user.UserId)); // Add another claims here context.IssuedClaims.AddRange(claims); } public async Task IsActiveAsync(IsActiveContext context) { } } public class UserResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator { public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context) { UserRepository userRepository=new UserRepository(); var userLoginStatus = userRepository.GetUserById(context.UserName, context.Password); if (userLoginStatus != null) { context.Result = new GrantValidationResult(userLoginStatus.UserId.ToString(), OidcConstants.AuthenticationMethods.Password); } else { context.Result = new GrantValidationResult(TokenRequestErrors.InvalidClient, "Wrong Credentials"); } } }
Merci beaucoup pour ça. Je vais créer un référentiel et tester ce code. Une autre chose que je voudrais demander depuis que je fais de l'application de commerce électronique, quel type de subvention je devrais utiliser? Suis-je en utilisant le type de subvention correct ici? Merci encore !!
Créez-vous une nouvelle application ou étendue à plus âgé .Vous pouvez voir la recommandation pour l'application type dans le document officiel.
C'est une nouvelle application. Ok je vais vérifier le doc.
@Glennsingh Le plus grand inconvénient du flux de propriétaires de ressources est que l'utilisateur et l'authentification Server doit faire confiance à l'application client. Si vous construisez l'application E-Commerce, vous feriez mieux de sortir avec le flux de code d'autorisation
@Glennsingh Une autre raison Le flux de propriétaires de ressources n'est pas recommandé est que l'application client doit gérer les mots de passe de l'utilisateur. Qui est difficile du point de vue de la sécurité.
@kishan Vaishnav merci beaucoup pour votre suggestion. Je me débats toujours avec mon projet Demo.Auth. J'ai créé le client de Razor MVC qui contient tous les éléments UI tels que la page de la liste de produits, etc. Mais lorsque l'utilisateur cliquera sur Ajouter au panier, je devrais rediriger l'utilisateur à la page de connexion. Je ne comprends pas comment ce code ressemblera. Je lis la documentation, j'espère que je serai à travers. Si vous obtenez un jour, je vous demande d'ajouter du code au référentiel ci-dessus qui sera une grande aide. Je suis coincé. Merci
Reportez-vous à YouTube.com/playlist?list=PLOEFNOV9YBA7DNRJPOG6LMPCYD7WN7E8V Il a tout mis en place étape par étape
Comment puis-je ajouter les utilisateurs à ma base de données et authentifier l'utilisateur de la base de données et non le test. p>
Une autre chose que je ne comprends pas est l'endroit où je devrais mettre la fonctionnalité de connexion et enregistrer et comment ce code ressemblera. P> blockQuote>
Il existe un moyen de créer un exemple de travail conforme à vos exigences en utilisant principalement des implémentations à partir d'ItalyServer4 QuickStarts. P>
Les étapes sont (à l'aide de la base de données SQL): P>
Créez un projet de base MVC à l'aide de la gabarit IS4Aspid DotNet. Il configurera IdentityServer en tant que middleware pour le projet, vous pouvez mettre à jour la base de données avec la migration prête pour créer toutes les tables pour l'identité de base ASP.NET et la connexion, la déconnexion, le consentement, la fonctionnalité des subventions (UI) pour ItalyServer. (Dans CreeeticidentalSchema.cs Fichier Avant DB Mettre à jour, remplacez l'annotation de la colonne Identity pour vous conformer à la base de données SQL conformément à: Annotation («SQLSERVER: ValueGenerationStrategy», SQLServerValueGenerationtrategy.identityColumn), Schema dans le modèle est pour la base de données SQLITE) P> li>
Activer les pages RAZORE dans Startup.cs de MVC Core Project, ajout de services.AntazorPages () et des points finaux.Maprazorpages (), il sera alors possible d'ajouter des échafaudages et vous pouvez ajouter toutes les pages dont vous avez besoin pour vous inscrire et Maintenir les comptes d'utilisateurs (locaux et fournisseurs externes) à l'aide de la bibliothèque de classes de rasoir. Les pages de connexion et de déconnexion doivent rester sous le contrôle de ItalyServer pour un but d'authentification. P> li>
Ensuite, vous pouvez utiliser ConfigurationDBContext, persistedgrantdbcontext de contextes et leurs entités à partir du package ItalyServer4.entityFramework.storage Nuget pour créer une migration et une mise à jour de la base de données d'identité ASP.Net existante, ainsi que des tables pour les clients, les ressources et les étanches. données opérationnelles telles que les codes d'autorisation et rafraîchir les jetons. Pour ajouter, supprimer ou mettre à jour les données sur ces tables, vous pouvez créer manuellement une interface à l'aide de ces deux contextes. P> li>
La dernière étape consiste à créer des projets client et API en fonction de QuickStarts et de les configurer avec ItalyServer à utiliser. P> li> ol>
Démarrage.Cs Fichier à la fin sera le suivant: P>
public class Startup { public IWebHostEnvironment Environment { get; } public IConfiguration Configuration { get; } public Startup(IWebHostEnvironment environment, IConfiguration configuration) { Environment = environment; Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddScoped<IEmailSender, EmailSender>(); services.AddControllersWithViews(); services.Configure<IISOptions>(iis => { iis.AuthenticationDisplayName = "Windows"; iis.AutomaticAuthentication = false; }); services.Configure<IISServerOptions>(iis => { iis.AuthenticationDisplayName = "Windows"; iis.AutomaticAuthentication = false; }); var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); var builder = services.AddIdentityServer(options => { options.Events.RaiseErrorEvents = true; options.Events.RaiseInformationEvents = true; options.Events.RaiseFailureEvents = true; options.Events.RaiseSuccessEvents = true; }) .AddConfigurationStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sql => sql.MigrationsAssembly(migrationsAssembly)); }) .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sql => sql.MigrationsAssembly(migrationsAssembly)); }) .AddAspNetIdentity<ApplicationUser>(); builder.AddDeveloperSigningCredential(); services.AddRazorPages(); services.AddAuthentication() .AddGoogle(options => { options.ClientId = "copy client ID from Google here"; options.ClientSecret = "copy client secret from Google here"; }); } public void Configure(IApplicationBuilder app) { if (Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } app.UseStaticFiles(); app.UseRouting(); app.UseIdentityServer(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); endpoints.MapRazorPages(); }); } }
Je suis vraiment désolé mais je n'ai pas compris le 2e point du tout. Je me souviens de la dernière fois que j'ai créé une application Razor MVC en utilisant l'échafaud d'identité et qui a bien fonctionné pour moi. Mais ici je suis confus. Conformément à votre guidage, j'ai créé un repo public sur GitHub et suivi tous les points que vous avez mentionnés ci-dessus. Cela me donne une erreur comme "client non autorisé", j'ai testé mon code et je suis capable de générer le jeton et de pouvoir accéder aux appels de l'API, mais le client MVC ne fonctionne pas vraiment, je ne sais vraiment pas pourquoi cela se produit.
Au point 4, vous avez mentionné créer une API et un projet client, j'ai ajouté que, mais ne comprenait pas le 2e point. Dans les pages Razor (client MVC) et créé le "login.cshtml" mais rien ne semble fonctionner pour moi. Pouvez-vous s'il vous plaît ajouter du code dans mon repo ou me suggérer. S'il vous plaît aidez-moi, ne pas comprendre où je vais mal. Repo: Github.com/ashwani44/sol_ecommerce_demo
Glenn Singh Vous n'avez pas besoin de pages de rasoir dans le client MVC. Client redirigé (options.defaultChallengescheme = "OIDC") appels non autorisés vers Authserver Project dans lequel vous disposez de la connexion et de la déconnexion des pages dans le dossier Vues / compte, ils sont livrés avec le modèle IS4Aspid. Dans le 2e point, j'ai mentionné aux pages de rasoir d'échafaudes dans le projet Authserver pour ajouter un registre, Supprimer ... Pages Outre les pages de connexion et de déconnexion existantes qui doivent rester sous contrôle ItalyServer. Zones \ identité \ pages \ dossier de compte manquent dans votre projet Demo.AuthSevererver.