从自定义用户标识类获取UserId

本文关键字:获取 UserId 用户标识 自定义 | 更新日期: 2023-09-27 17:57:29

我正试图从我创建的自定义UserIdentity类访问UserId属性,但访问它的语法有问题。

这是类别:

using System.Security.Principal;
using System.Web.Security;
namespace Rework.Models
{
    public class UserIdentity : IIdentity, IPrincipal
    {
        private readonly FormsAuthenticationTicket _ticket;
        public UserIdentity(FormsAuthenticationTicket ticket)
        {
            _ticket = ticket;
        }
        public string AuthenticationType
        {
            get { return "User"; }
        }
        public bool IsAuthenticated
        {
            get { return true; }
        }
        public string Name
        {
            get { return _ticket.Name; }
        }
        public string UserId
        {
            get { return _ticket.UserData; }
        }
        public bool IsInRole(string role)
        {
            return Roles.IsUserInRole(role);
        }
        public IIdentity Identity
        {
            get { return this; }
        }
    }
}
Here is the code block in which I try to access the UserId property and put its value into the id variable.
    using (UsersContext db = new UsersContext())
                {
                    if (db.Users.Any(u => u.UserName != txtUsername.Text))
                    {
                        var newUserObj = new User { UserName = txtUsername.Text };
                        UsersContext newUser = new UsersContext();
                        newUser.AddUser(newUserObj);
                    }
                    if (!User.IsInRole("Member") || !User.IsInRole("Admin") || !User.IsInRole("SuperAdmin"))
                    {
                        var id = //This is where I need to access the prop
                        db.AddUserRole(new UserRole {UserId = id, RoleId = 3});
                    }
                }

使用内置类,您可以执行Users.Identity.GetId();,但我不太确定如何使用自定义类。任何帮助都将不胜感激!

从自定义用户标识类获取UserId

我认为以下代码是错误的:

if (db.Users.Any(u => u.UserName != txtUsername.Text))
{
    var newUserObj = new User { UserName = txtUsername.Text };
    UsersContext newUser = new UsersContext();
    newUser.AddUser(newUserObj);
}

db.Users.Any(u => u.UserName != txtUsername.Text)部分让我有点烦。基本上,您正在检查数据库中是否有任何用户的用户名与输入的用户名不同。如果你得到了一些结果,你就创建了一个新用户。这在实际中总是存在的,因为总会有一个用户的用户名与输入的用户名不同(除非没有用户)。也许我只是误读了这个条件,但它仍然让我有点困惑。)

您应该将其重写为:

var user = db.Users.SingleOrDefault(u => u.UserName == txtUsername.Text);
if (user == null)
{
    var user = new User { UserName = txtUsername.Text };
    //UsersContext newUser = new UsersContext(); // Not sure why you need new context, since you are already inside UsersContent
    db.AddUser(user);
    db.SaveChanges(); // only neccessary if User's Id is identity to get newly created Id.
}

之后,您可以访问user.UserIduser.Id属性以获取用户(当前或新)的Id