2014-05-13 2 views
6

Ich erstellte benutzerdefinierte Benutzermodell für Entitätsrahmen und ASP.net-Identität. Ich überprüfte andere Antworten hier, sie sind nah an meiner Frage, aber Antworten nicht meine Anforderung anwenden. also frage ich hier.Nach Identity Custom User gibt User.Identity.GetUserId() falschen Typ als Zeichenfolge zurück

Alles ist in Ordnung. Aber wenn ich versuche, Benutzer-ID wie zu bekommen:

ApplicationUser user = await manager.FindByIdAsync(User.Identity.GetUserId()); 

User.Identity.GetUserId() return String. Ich habe es wie Guid konfiguriert. Aber es gibt String :(

Meine Klassen hier sind. Bitte helfen Sie mir, wie kann ich User.Identity.GetUserId() in einem Web-api-Controller als Guid bekommen?

public class GuidUserLogin : IdentityUserLogin<Guid> 
    { 
    } 


    public class GuidUserRole : IdentityUserRole<Guid> 
    { 
    } 

    public class GuidUserClaim : IdentityUserClaim<Guid> 
    { 
    } 

    public class GuidRole : IdentityRole<Guid, GuidUserRole> 
    { 
    } 

//public class GuidUserContext : IdentityDbContext<ApplicationUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> { } 
    public class GuidUserStore : UserStore<ApplicationUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> 
    { 
     public GuidUserStore(DbContext context) 
      : base(context) 
     { 
     } 
    } 

    public class GuidRoleStore : RoleStore<GuidRole, Guid, GuidUserRole> 
    { 
     public GuidRoleStore(DbContext context) 
      : base(context) 
     { 
     } 
    } 


    public class ApplicationUser : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim>, ICreateDateRequired 
    { 
     public ApplicationUser() 
     { 


     } 

     [Key] 
     public Guid UserId { get; set; } 

     public override Guid Id { get; set; } 

     public override string UserName { get; set; } 
     public string Name { get; set; } 
     public string Surname { get; set; } 

     public string Password { get; set; } 

     //Matching Attributes 

     public override string Email { get; set; } 
     public string FacebookId { get; set; } 
     public string TwitterId { get; set; } 
     public string GoogleId { get; set; } 
     public override string PhoneNumber { get; set; } 

     public string SocialAccessToken { get; set; } 

     public string Gender { get; set; } 

     public virtual List<Shade> Shades { get; set; } 

     [InverseProperty("ParentUser")] 
     public virtual List<UserFriendship> Friends { get; set; } 

     public virtual List<Contact> Contacts { get; set; } 

     //[Column(TypeName = "DateTime2")] 
     //[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
     public DateTime? CreateDate { get; set; } 

     public string ImageUrl { get; set; } 
     public string ThumbUrl { get; set; } 
     public string BackUrl { get; set; } 

     public virtual List<ContactDetail> UserContactDetails { get; set; } 
    } 

Antwort

5

GetUserId() ist eigentlich die folgende Erweiterungsmethode: (! Cookies)..

Microsoft.AspNet.Identity.IdentityExtensions.GetUserId(this IIdentity identity) 

an einem gewissen Punkt gibt es keine Möglichkeit, einen Wert zu speichern, als Guid Dies bedeutet, werden Sie es manuell ändern (ich habe gerade das selbst heute) Was Ich habe alles bewegt, wasverwendet, Microsoft.AspNet.Identity.Owin und Microsoft.Owin.Security in ein separates Verzeichnis. Dann schrieb meine eigene Erweiterung Klasse:

internal static class IIdentityExtensions 
{ 
    public static Guid GetUserId(this IIdentity identity) 
    { 
     var result = Guid.Empty; 

     string id = Microsoft.AspNet.Identity.IdentityExtensions.GetUserId(identity); 

     Guid.TryParse(id, out result); 

     return result; 
    } 

    public static string GetUserName(this IIdentity identity) 
    { 
     string result = Microsoft.AspNet.Identity.IdentityExtensions.GetUserName(identity); 

     return result; 
    } 

    public static string FindFirstValue(this ClaimsIdentity identity, string claimType) 
    { 
     string result = Microsoft.AspNet.Identity.IdentityExtensions.FindFirstValue(identity, claimType); 

     return result; 
    } 
} 

So stellen Sie sicher, dass Sie für Guid.Empty überprüfen (oder es zu Guid ändern?). Sie werden feststellen, dass es einige Dinge gibt, die nur string akzeptieren, und Sie müssen sie konvertieren. Zum Beispiel:

namespace Microsoft.Owin.Security 
{ 
    public static class AuthenticationManagerExtensions 
    { 
    public static ClaimsIdentity CreateTwoFactorRememberBrowserIdentity(
     this IAuthenticationManager manager, 
     string userId); 
    public static Task<bool> TwoFactorBrowserRememberedAsync(
     this IAuthenticationManager manager, 
     string userId); 
    } 
} 

So werden Sie zu .GetUserId().ToString() haben für bestimmte Methoden zu arbeiten.

+0

Aber wenn ich versuche, Guid-ID in Web-API-Controller zu bekommen, gibt es String wieder zurück. var stringResult = IdentityExtensions.GetUserId (RequestContext.Principal.Identity); – Ras

+0

Klingt wie ein Namespace-Problem, Sie erhalten die falsche Erweiterungsmethode. –

+0

Danke. Ich habe es behoben, wie du gesagt hast. Und jetzt gibt es einen Fehler.Ein oder mehrere Validierungsfehler wurden während der Modellerzeugung festgestellt: GuidUserStore:: EntityType 'GuidUserStore' hat keinen Schlüssel definiert. Definieren Sie den Schlüssel für diesen EntityType. UserStores: EntityType: EntitySet 'UserStores' basiert auf dem Typ 'GuidUserStore', für den keine Schlüssel definiert sind. – Ras

0

Für unser Projekt musste ich den Schlüssel basierend auf IUserKey abstrahieren (und die Kennung als long innerhalb dieser Schnittstelle speichern).

Das Problem mit der UserManager stark abhängig von Zeichenfolgen wurde (für mich) durch einfaches Überschreiben der ToString() Methode in der konkreten Implementierung des Benutzerschlüsselobjekts gelöst.

public class IdentityUserKey : IIdentityUserKey 
{ 
    public long UserId { get; set; } 

    public bool Equals(IIdentityUserKey other) 
    { 
     return other != null && other.UserId == UserId; 
    } 

    public override string ToString() 
    { 
     return UserId.ToString(); 
    } 
} 

In Ihrem Fall könnten Sie vielleicht Guid in einer ähnlichen Schnittstelle haben gewickelt und lieferten dann die notwendige ToString() auch außer Kraft setzen.

9

Die Definition von GetUserID ist dies:

public static string GetUserId(this IIdentity identity); 
public static T GetUserId<T>(this IIdentity identity) where T : IConvertible; 

Leider ist Guid kein IConvertible und es wird die Guid Typ in der generischen Form nicht zurück. Daher können wir nicht verwenden: User.Identity.GetUserId()<Guid> wie einige Leute User.Identity.GetUserId()<Int> verwenden, wenn sie die ID in Int ändern.

Daher sollten Sie Guid.Parse() oder Guid.TryParse()

Guid.Parse(User.Identity.GetUserId()) 

@Erik Methode funktioniert gut, aber da ich nicht das Original zu überschreiben, haben wollte, habe ich die folgende allgemeine Erweiterung:

public static class ExtensionMethods 
{ 
    public static Guid ToGuid(this string value) 
    { 
     Guid result= Guid.Empty; 
     Guid.TryParse(value, out result); 
     return result;   
    } 
} 

und dann habe ich folgendes verwendet:

User.Identity.GetUserId().ToGuid() 

Bearbeiten: Ich kam mit einer anderen Lösung:

Ich habe eine Erweiterung des Identity-Objekts hinzugefügt.

public static class IdentityExtensions 
{ 
    public static Guid GetGuidUserId(this IIdentity identity) 
    { 
     Guid result = Guid.Empty; 
     Guid.TryParse(identity.GetUserId(), out result); 
     return result; 
    } 
} 
Verwandte Themen