我为实体框架和asp.net身份创建了自定义用户模型。 我在这里检查了其他答案,他们接近我的问题,但答案不符合我的要求。所以我在这里问。
一切都好。 但是,当我尝试获得用户ID时:
ApplicationUser user = await manager.FindByIdAsync(User.Identity.GetUserId());
User.Identity.GetUserId()返回字符串。我像Guid一样配置它。但它返回字符串:(
我的课程在这里。 请帮帮我,如何在web api控制器中将User.Identity.GetUserId()作为Guid获取?
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; }
}
答案 0 :(得分:10)
GetUserId的定义是:
public static string GetUserId(this IIdentity identity);
public static T GetUserId<T>(this IIdentity identity) where T : IConvertible;
不幸的是,Guid不是IConvertible,它不会以Generic形式返回Guid类型。因此,我们无法使用User.Identity.GetUserId()<Guid>
,因为有些人在将ID更改为Int时会使用User.Identity.GetUserId()<Int>
。
因此,您应该使用Guid.Parse()
或Guid.TryParse()
Guid.Parse(User.Identity.GetUserId())
@Erik方法工作正常,但由于我不想覆盖原来的方法,我添加了以下一般扩展名:
public static class ExtensionMethods
{
public static Guid ToGuid(this string value)
{
Guid result= Guid.Empty;
Guid.TryParse(value, out result);
return result;
}
}
然后我用了这个:
User.Identity.GetUserId().ToGuid()
编辑:我想出了另一个解决方案:
我添加了Identity对象的扩展名。
public static class IdentityExtensions
{
public static Guid GetGuidUserId(this IIdentity identity)
{
Guid result = Guid.Empty;
Guid.TryParse(identity.GetUserId(), out result);
return result;
}
}
答案 1 :(得分:5)
GetUserId()
实际上是以下扩展方法:
Microsoft.AspNet.Identity.IdentityExtensions.GetUserId(this IIdentity identity)
在某些时候,无法将值存储为Guid
(cookies!)。这意味着您必须手动更改它(我今天就这样做了)。我所做的是将使用Microsoft.AspNet.Identity
,Microsoft.AspNet.Identity.Owin
和Microsoft.Owin.Security
的所有内容移动到一个单独的目录中。然后写了我自己的扩展类:
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;
}
}
请确保检查Guid.Empty
(或将其更改为Guid?)。您会发现有很多事情只接受string
,您必须转换它们。例如:
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);
}
}
因此,您必须.GetUserId().ToString()
才能使用某些方法。
答案 2 :(得分:0)
对于我们的项目,我需要根据IUserKey
抽象密钥(并将标识符存储为此接口中的long
)。
通过简单地覆盖用户密钥对象的具体实现中的UserManager
方法,解决了({1}}严重依赖字符串的问题(对我而言)。
ToString()
在您的情况下,也许您可以将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();
}
}
包裹在类似的界面中,然后也提供必要的Guid
覆盖。