J'utilise l'autorisation asp.net pour me connecter avec Angular js pour le côté client, je dois me connecter à l'utilisateur actuel
i besoin d'obtenir l'utilisateur actuel pour enregistrer toute opération dans ma table de journalisation, et httpcontext.session.current est nul, existe-t-il un autre moyen de sauvegarder l'utilisateur connecté en session ou quelque chose d'autre pour l'obtenir à tout moment
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider { private readonly string _publicClientId; static ERPV02_03Entities db; public ApplicationOAuthProvider(string publicClientId) { if (publicClientId == null) { throw new ArgumentNullException("publicClientId"); } db = SingleTonConText.Instance; _publicClientId = publicClientId; } public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password); if (user == null) { context.SetError("invalid_grant", "The user name or password is incorrect."); return; } ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); AuthenticationProperties properties = CreateProperties(user.UserName); AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties); context.Validated(ticket); context.Request.Context.Authentication.SignIn(cookiesIdentity); } public override Task TokenEndpoint(OAuthTokenEndpointContext context) { foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) { context.AdditionalResponseParameters.Add(property.Key, property.Value); } var data= Task.FromResult<object>(null); return data; } public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) { // Resourcee owner password credentials does not provide a client ID. if (context.ClientId == null) { context.Validated(); } return Task.FromResult<object>(null); } public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context) { if (context.ClientId == _publicClientId) { Uri expectedRootUri = new Uri(context.Request.Uri, "/"); if (expectedRootUri.AbsoluteUri == context.RedirectUri) { context.Validated(); } } return Task.FromResult<object>(null); } private static View_Emps GetUserInfo(string username) { var user = new View_Emps(); try { user = db.View_Emps.FirstOrDefault(p => p.Emp_UserName == username); HttpContext.Current.Session.Add("user", user); } catch (Exception e) { throw e; } return user; } public static AuthenticationProperties CreateProperties(string userName) { var user = GetUserInfo(userName); JavaScriptSerializer js = new JavaScriptSerializer(); var res = js.Serialize(user); IDictionary<string, string> data = new Dictionary<string, string> { { "User", res } }; return new AuthenticationProperties(data);}} public void SaveLog( T Obj, string Operation) { string hostName = Dns.GetHostName(); // Retrive the Name of HOST IpAddress string myIP = Dns.GetHostEntry(hostName).AddressList[0].ToString(); var user = HttpContext.Current.Session["user"] as View_Emps; MyLogger.Data = new JavaScriptSerializer().Serialize(Obj); MyLogger.OperationType = Operation; MyLogger.TableName = typeof(T).Name; MyLogger.DateTime = DateTime.Now; MyLogger.User_ID = user.Emp_ID; MyLogger.IP_Address = myIP; db.Loggers.Add(MyLogger); Commit(); }
4 Réponses :
Vous pouvez obtenir l'utilisateur de connexion actuel dans Api Controller à partir de IPrincipal
et vous n'aurez pas besoin de référencer un espace de noms pour lui comme,
ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal; var claims = principal.Claims.Select(x => new { type = x.Type, value = x.Value }); var id = claims.Where(x => x.type == "Id").FirstOrDefault().value; var userName = claims.Where(x => x.type == "UserName").FirstOrDefault().value; var email = claims.Where(x => x.type == "Email").FirstOrDefault().value; var phoneNumber = claims.Where(x => x.type == "PhoneNumber").FirstOrDefault().value; ApplicationUser applicationUser = new ApplicationUser //This model is pre generated by web api project and reside in `Models` folder { Id = id, UserName = userName, Email = email, PhoneNumber = phoneNumber };
Vous pouvez également obtenir d'autres propriétés de IPrincipal
comme
À partir de l'identité d'un utilisateur tel que,
oAuthIdentity.AddClaim(new Claim("Id", user.Id)); oAuthIdentity.AddClaim(new Claim("UserName", user.UserName)); oAuthIdentity.AddClaim(new Claim("Email", user.Email)); oAuthIdentity.AddClaim(new Claim("PhoneNumber", user.PhoneNumber));
Modifier:
Vous pouvez ajouter votre des champs personnalisés comme revendiquant votre identité dans la méthode GrantResourceOwnerCredentials
comme,
module.run(function($http) { $http.defaults.headers.common.Authorization = 'bearer TGAf8ViNUtzb9RP9OCBXHN4Ewm0dQbTMb6x4wJMgi4Wk8pq-QEQLIhp_W1A-9jQa7Rlqa60vsQ2ubbjUL0wGosEwaHFDlbdkQqXbOP_VlBJMxN2KnGQZnmvWZvpLPqMF-jpWzPDvBwtVHnh3AjLviPX0gPQjxZAC1ujIeB0p-QZ8yE1VCnLa8Xql01XDXlLVBCzk1UOqt_er-Gx6pL8SemayY8dqVVUgSZTYhcceLLuWQ-Cy3QATJmoJ41K-7ktAeUTz5H7V3ImlC_b8qnnN8sj7k7WRT51q27pUO4-bzJzkD4LGVvDUqaeAhBEqKyS9TkpMIFbRDMol5ZiJcp2vTunOOYP42Mw7GJv09ctoXegKkWo1LWDsSDxeWP5KQed_VGX193pZvQtvz06g2iyXwuP8Q6NaJcXTF43-M9p2HWgGuXT531YXv59euaWevj1AMJkazlZ61uzYi7KGLHKgCwzAMXLKwzBGK4QP0C4tqonowSdTttH93LBOJHjrDepk'; });
Et puis dans la méthode d'action du contrôleur Api, vous pouvez obtenir cet UserId comme, p>
var userId = ((ClaimsIdentity)User.Identity).FindFirst("UserId"); var userName = ((ClaimsIdentity)User.Identity).FindFirst("UserName");
Modifier 1:
Ici, j'ai UserId
et UserName
des revendications.
Et depuis angular js HTTP, vous pouvez envoyer votre jeton de porteur d'authentification comme
... ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); oAuthIdentity.AddClaim(new Claim("UserId", user.Id)); //<= The UserId add here as claim oAuthIdentity.AddClaim(new Claim("UserName", user.UserName)); //<= The UserName add here as claim ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); ...
En utilisant le code ci-dessus sur le côté angulaire, votre requête ajoutera un jeton d'authentification pour chaque requête via Http
en savoir plus sur $ http
Édition 2:
Ajoutez ces données en tant que revendication dans GrantResourceOwnerCredentials
que vous souhaitez transférer sur votre référentiel d'unité de travail comme,
var authType = User.Identity.AuthenticationType; var isAuthenticated = User.Identity.IsAuthenticated; var name = User.Identity.Name;
Ensuite, lisez ces données dans votre méthode de contrôleur comme
... var user = User; //<= "User" comes from System.Security.Principal.IPrincipal ...
Vous êtes maintenant libre d'utiliser cet objet applicationUser
pour passer dans votre référentiel d'unité de travail.
User.Identity.Name est nul aussi
Afficher la section Modifier dans la réponse et me le faire savoir :)
Je l'ai essayé mais toujours nul quand je les ai dans mon contrôleur
veuillez ajouter un point d'arrêt sur la variable oAuthIdentity
et vérifier les revendications à l'intérieur de cette variable en mode débogage et me faire savoir quelles sont les revendications ajoutées?
oui que ce que j'ai fait => User.Identity toutes ses variables = null et Claims Empty n'ont donné aucun résultat
non pas ici si les revendications n'ont pas été ajoutées lors de l'authentification, vous avez obtenu null dans User.Identity. Je dois dire que veuillez ajouter un point d'arrêt sur la variable oAuthIdentity
dans la méthode GrantResourceOwnerCredentials
et vérifier une fois en mode débogage
oui il a bien ajouté et a des valeurs mais quand j'essaye de l'avoir dans mon contrôleur deviens
ok signifie que les réclamations ont été ajoutées avec succès, mais le seul problème concerne la suppression, veuillez donc patienter. Je vais essayer quelque chose pour obtenir ces valeurs.
exactement, les revendications sont devenues vides lorsque j'essaye de les récupérer
continuons cette discussion en chat .
essayez ceci dans votre contrôleur => ClaimsIdentity claimsIdentity = User.Identity as ClaimsIdentity; var claims = claimsIdentity.Claims.Select (x => new {type = x.Type, value = x.Value});
et indiquez-moi les valeurs à l'intérieur de la variable claims
ci-dessus.
essayez également ceci => ClaimsPrincipal principal = Request.GetRequestContext (). Principal as ClaimsPrincipal; var claims = principal.Claims.Select (x => new {type = x.Type, value = x.Value}); var id = claims.Where (x => x.type == "UserId"). FirstOrDefault (). value;
Ok, j'ai le problème et c'est que vous n'envoyez pas votre jeton de porteur d'authentification à partir d'une requête HTTP angulaire, c'est pourquoi toutes vos revendications deviennent nulles. voir dans ma capture d'écran dans la section Edit1 J'ai obtenu l'identifiant et le nom d'utilisateur avec succès
Merci de tout cœur homme pour vos efforts et m'aider, je sais que ce sera un succès car le porteur et le jeton n'envoient pas ma demande
Alors, avez-vous reçu des réclamations après avoir passé le jeton au contrôleur?
Non je ne l'ai pas encore essayé
Tout d'abord, je vous suggère d'essayer de transmettre votre jeton avec la demande http de Postman et si vous avez du succès, essayez d'angular et faites le moi savoir. J'attendrai votre réponse.
Toujours nul bro :( @ er-mfahhgk
Son fonctionnement voir la capture d'écran. Mais je me demande aussi comment cela ne fonctionne pas pour vous. Alors demain, je prendrai une session avec vous sur TeamViewer ou AnyDesk si vous vous sentez à l'aise.
Pas de problème, envoyez-moi à: alaaasaleh7@gmail.com
depuis dbcontext.current.session ne peut pas l'utiliser, comment enregistrer ces données pour les transmettre à la fonction de journalisation?
Ajoutez toutes ces données nécessaires à la fonction de journalisation en tant que revendication dans votre méthode grantresource et dans votre fonction de journal, lisez ces revendications et préparez votre "View_Emps", puis enregistrez-la dans la base de données.
J'utilise l'unité de travail et le référentiel, j'ai donc besoin d'un moyen d'obtenir les données des revendications dans mon référentiel, lorsque j'utilisais mvc, je recevais de la session en cours dans mon référentiel, alors comment l'obtenir à l'aide de l'api
Passez en revue cette question Est-ce possible de définir la variable localStorage ou Session dans la page asp.net et de la lire en javascript sur l'autre page?
MyLogger.Data = new JavaScriptSerializer().Serialize(Obj); MyLogger.OperationType = Operation; MyLogger.TableName = typeof(T).Name; MyLogger.DateTime = DateTime.Now; MyLogger.User_ID = user.Emp_ID; MyLogger.IP_Address = myIP; db.Loggers.Add(MyLogger); Commit(); }
// au lieu de cela .. vous pouvez cela dans le stockage local et supprimez-le après la déconnexion ou l'expiration du délai // minuterie
public void SaveLog( T Obj, string Operation) { string hostName = Dns.GetHostName(); // Retrive the Name of HOST IpAddress string myIP = Dns.GetHostEntry(hostName).AddressList[0].ToString(); var user = HttpContext.Current.Session["user"] as View_Emps;
vous ne pouvez pas utiliser la session dans un appel API, chaque fois que vous devez authentifier l'utilisateur, vous devez envoyer le jeton de l'utilisateur
vous pouvez en savoir plus sur JWT pour l'authentification
L'utilisateur sera toujours nul
5adt moins 😂😂
Oui je vais l'essayer après demain car j'ai des vacances, et ce problème à mon travail
var UserName = User.Identity.Name; var UserId = ((ClaimsIdentity)User.Identity).Claims.FirstOrDefault().Value; It works well with that way but i had to Send token in header though
Cela signifie que ma réponse vous a aidé à résoudre votre problème. Donc pas besoin de se connecter avec TeamViewer ou AnyDesk, non?