目前在Identity 2.2.1中,可以使用User.Identity来检索用户ID和用户名:
string ID = User.Identity.GetUserId();
string Name = User.Identity.Name;
但是,我想将其扩展到User.Identity.FullName,User.Identity.FirstName等。
我尝试创建自定义IIdentity和IPrincipal类,然后设置FormAuthentication cookie。我认为这是错误的方式,因为它与DefaultAuthenticationTypes.ApplicationCookie产生冲突。 http://problemfacing.blogspot.in/2013/07/aspnet-mvc-set-custom-iidentity-or.html
还有可以查看的claimIdentity。我无法使其适用于Identity 2.2.1,而有足够的2.0和2.1解决方案
有人可以通过Identity 2.2.1告诉我一种优雅,简单的方法吗?
答案 0 :(得分:1)
您可以在Claims
中将这些属性添加为ApplicationUser
,如下所示:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var identity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
var user = this;
// Add Full Name, Firstname etc....
identity.AddClaim(new Claim("FullName", user.FirstName + ' ' + user.LastName));
}
}
然后,您无需访问数据库即可访问这些声明。
如果您希望扩展User类,则可以为Identity或Principal创建扩展方法。这是一个例子:
public class UserPrincipal : ClaimsPrincipal
{
public UserPrincipal(ClaimsPrincipal principal)
: base(principal)
{
}
/// <summary>
/// Full Name of current logged in user.
/// </summary>
public string FullName
{
get
{
return this.FindFirst("FullName").Value ?? string.Empty;
}
}
}
现在,您可以在控制器中创建一个方法来访问FullName(如下所示):
private UserPrincipal CurrentUser
{
get
{
return new UserPrincipal(base.User as ClaimsPrincipal);
}
}
现在您可以在控制器中使用CurrentUser.FullName
。
如果要抽象它,可以创建一个BaseController类:
public class BaseController : Controller
{
public UserPrincipal CurrentUser
{
get
{
return new UserPrincipal(base.User as ClaimsPrincipal);
}
}
}
并在所有控制器中继承BaseController
而不是Controller
。
答案 1 :(得分:0)
为Identity创建自定义用户非常容易。
第一步是创建User
,其中包含自定义字段,并从IdentityUser
命名空间中的Microsoft.AspNet.Identity.EntityFramework
派生:
public class MyUser : IdentityUser
{
public string FirstName{ get; set; }
public string LastName { get; set; }
}
然后,您需要通过从身份UserManager
UserManager
public class UserManager : UserManager<MyUser>
{
public UserManager(Context context, IUserTokenProvider<MyUser, string> tokenProvider = null)
: base(new MyUserStore(context))
{
UserTokenProvider = tokenProvider;
UserValidator = new UserValidator<MyUser>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
PasswordValidator = new PasswordValidator
{
RequireDigit = false,
RequireLowercase = false,
RequireNonLetterOrDigit = false,
RequireUppercase = false,
RequiredLength = 2
};
}
}
最后,您应该通过派生自定义UserStore
来创建自定义public class MyUserStore : UserStore<MyUser>
{
public MyUserStore(Context context)
: base(context)
{
}
}
:
typedef int rl_icpfunc_t (char *);
答案 2 :(得分:0)
您可以通过添加扩展方法来实现:
public static class IdentityExtention
{
public static string FullName(this System.Security.Principal.IIdentity user)
{
return // return fullName from database;
}
}
然后您可以在视图中轻松使用它:
User.Identity.FullName()