扩展Identity 2.2.1以存储自定义数据

时间:2015-08-18 07:01:16

标签: c# asp.net asp.net-mvc authentication asp.net-identity

目前在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告诉我一种优雅,简单的方法吗?

3 个答案:

答案 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()