18 messaggi dal 18 aprile 2018
Buonasera a tutti,
vorrei far si che dopo aver effettuato il login l'utente riceva come messaggio di benvenuto, messaggio + suo nome ad esempio:
Benvenuto Mirko.
se uso

 Benvenuto @User.Identity.GetUserId();


mi restituisce la mail..
questo è il mio identity:

 public class ApplicationUser : IdentityUser
    {
        public string Nome { get; set; }
        public string Cognome { get; set; }

        public string Telefono { get; set; }
        
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
        {
            // Tenere presente che il valore di authenticationType deve corrispondere a quello definito in CookieAuthenticationOptions.AuthenticationType
            var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
            // Aggiungere qui i reclami utente personalizzati
            
            return userIdentity;
        }
    }


ho cercato diverse guide nel web ma non ho trovato nulla di soddisfacente.
Grazie in anticipo
10.680 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,
il nome dell'utente lo puoi aggiungere come claim nella ClaimsIdentity che viene creata per lui.
Ecco un esempio:
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
  // Tenere presente che il valore di authenticationType deve corrispondere a quello definito in CookieAuthenticationOptions.AuthenticationType
  var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
  // Aggiungo il claim
  userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, Nome));  


  return userIdentity;
}


Il claim verrà inserito nel cookie di autenticazione e perciò tornerà ad ASP.NET in ogni successiva richiesta. Tu lo puoi estrapolare da User.Identity in questo modo:
@User.Identity.GetGivenName()


Ho usato un extension method personalizzato chiamato GetGivenName, che dovrai creare tu. Magari mettilo nello stesso file in cui è stato dichiarato GetUserId, tanto anche questo è un extension method.
public static string GetGivenName(this IIdentity identità) {
  var claimsIdentity = identità as ClaimsIdentity;
  return claimsIdentity?.FindFirst(ClaimTypes.GivenName)?.Value;
}

L'ho scritto a memoria, spero di non aver fatto errori.

ciao,
Moreno

Enjoy learning and just keep making
18 messaggi dal 18 aprile 2018
Ciao Moreno, grazie come sempre della tua disponibilità..

ho provato ad inserire l'extension method in ManageController (dove risiede il get user id ), l'ho inserito cosi:

namespace Toeletta18.Controllers
{
  
  public static string GetGivenName(this IIdentity identità)
        {
  var claimsIdentity = identità as ClaimsIdentity;
  return claimsIdentity?.FindFirst(ClaimTypes.GivenName)?.Value;
        }
    [Authorize]
    public class ManageController : Controller
    {


mi segnala errore su
public static string GetGivenName(this IIdentity identità)
Uno spazio dei nomi non può contenere direttamente membri come campi o metodi devo inserirlo altrove?
Modificato da Mirko2018 il 05 giugno 2018 17.34 -

Ho provato in un altro modo:
namespace Test.Controllers
{
  public static class Extension
  {
      public static string GetGivenName(this IIdentity identità)
    {
      var claimsIdentity = identità as ClaimsIdentity;
      return claimsIdentity?.FindFirst(ClaimTypes.GivenName)?.Value;
    }
  }

  [Authorize]
    public class ManageController : Controller
    {

almeno cosi mi fa compilare, ho aggiunto
public string Nome { get; set; }

anche nel accountviewmodel--> registerviewmodel ed ho aggiunto nella visualizzazione register

<div class="form-group">
    @Html.LabelFor(m => m.Nome, new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
      @Html.TextBoxFor(m => m.Nome, new { @class = "form-control" })
    </div>
  </div>

questo l'errore:

Il valore non può essere null.
Nome parametro: value


Riga 16:             var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
Riga 17:       // Aggiungere qui i reclami utente personalizzati
Riga 18:       userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, Nome));
Riga 19:       return userIdentity;
Riga 20:         }

Modificato da Mirko2018 il 05 giugno 2018 17.53 -
10.680 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,


Ho provato in un altro modo:

Corretto. Gli extension method devono essere definiti in una classe statica. Io ti consiglio di creare un nuovo file Extensions.cs e di definirlo lì dentro. Magari un file del genere ce l'hai già e al suo interno potrebbe essere stato definito l'extension method GetUserId(). Clicca col mouse su GetUserId e poi premi F12 per navigare alla sua definizione. In che file ti trovi?


Il valore non può essere null.
Nome parametro: value

Se il Nome dell'utente è null è normale che ti dia quell'errore. Potresti fare in modo che se l'utente non ha ancora fornito il suo nome, usi invece l'email.

userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, Nome ?? Email));


Oppure una stringa tipo "Utente". Qui scegli tu, tanto il valore verrà usato solo a scopo di visualizzazione.
userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, Nome ?? "Utente"));


ciao,
Moreno

Enjoy learning and just keep making
18 messaggi dal 18 aprile 2018
Buonasera Moreno
in effetti mi dava null perchè avevo dimenticato di aggiungere i campi nel controller :D cosi funziona... comunque ho fatto F12 e ho trovato la classe statica
public static class IdentityExtensions
    {
        public static string FindFirstValue(this ClaimsIdentity identity, string claimType);
        public static T GetUserId<T>(this IIdentity identity) where T : IConvertible;
        public static string GetUserId(this IIdentity identity);
        public static string GetUserName(this IIdentity identity);
    }

Ma è bloccata e non si può ne inserire ne modificare nulla al suo interno.. c'è un modo per aggiungerlo li oppure creo io una classe?

Un altra domanda.. ho visto che più volte hai usato
userIdentity.AddClaim(new Claim(ClaimTypes.GivenName, Nome ?? "Utente"));


a cosa serve '??'
Grazie mille
10.680 messaggi dal 09 febbraio 2002
Contributi
Ciao Mirko,


comunque ho fatto F12 e ho trovato la classe statica

Ok, vuol dire che quell'extension method è dichiarato in un assembly di ASP.NET Identity e quindi, essendo codice già compilato, non puoi apportare modifiche.
Quindi, come da piano originale, puoi creare una tua classe statica in cui inserire l'extension method GetGivenName(), oppure puoi sfruttare questo extension method qui:
public static string FindFirstValue(this ClaimsIdentity identity, string claimType);


Il tuo codice per recuperare il GivenName quindi diventerebbe:
@User.Identity.FindFirstValue(ClaimTypes.GivenName)


Scegli tu se preferisci creare un tuo extension method GetGivenName o se utilizzare FindFirstValue.


a cosa serve '??'

È il null coalescing operator. Questo operatore binario valuta l'operando che sta alla sua sinistra. Se non è null, restituisce il suo valore. Se invece è null, restituisce il valore dell'operando alla sua destra.

Ecco un esempio
string nome1 = "Mario";
string nome2 = null;

//risultato1 vale "Mario" perché nome1 non è null 
string risultato1 = nome1 ?? "Utente";
//risultato2 vale "Utente" perché nome2 è null
string risultato2 = nome2 ?? "Utente";


ciao,
Moreno
Modificato da BrightSoul il 06 giugno 2018 20.50 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.