5
votes

Existe-t-il un moyen d'obtenir l'utilisateur actuel dans Api Controller

 this what i got in Claims shown in the picture 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();



    }


0 commentaires

4 Réponses :


3
votes

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

  • AuthenticationType
  • Est authentifié
  • Nom

À 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.

 entrez la description de l'image ici

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.


23 commentaires

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



0
votes

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;


0 commentaires

-2
votes

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


3 commentaires

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



0
votes
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

1 commentaires

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?