Где я могу установить время последнего входа в систему при использовании ASP.NET и Owin? - PullRequest
0 голосов
/ 22 ноября 2018

Я реализовал аутентификацию с использованием удостоверения ASP.NET.Вход в систему фактически выполняется в этом методе OAuthAuthorizationServerProvider:

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

        ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "El nombre de usuario o la contraseña no son correctos.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }

В этот момент у меня нет доступа к таблице User, где существует поле с именем "lastLoginAt".Мне нужно обновить это поле до даты и времени, когда пользователь вошел в систему.

У меня также есть пользовательское хранилище, в котором есть метод, определенный следующим образом:

public Task UpdateAsync(T user)

, но этот методбудет вызван, если необходимо обновить сущность User.

Где вы предлагаете добавить код для обновления даты и времени последнего входа в систему?

1 Ответ

0 голосов
/ 22 ноября 2018

Что касается меня, я использовал это таким образом.

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        var userStore = new UserStore<ApplicationUser>(new ExtractorDbContext());
        var manager = new UserManager<ApplicationUser>(userStore);
        var user = await manager.FindAsync(context.UserName, context.Password);

        if (user != null)
        {
            string roleName = manager.GetRoles(user.Id).FirstOrDefault();

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("UserId", user.Id));
            identity.AddClaim(new Claim("Username", user.UserName));
            identity.AddClaim(new Claim("Email", user.Email));
            identity.AddClaim(new Claim("FirstName", user.FirstName));
            identity.AddClaim(new Claim("LastName", user.LastName));
            identity.AddClaim(new Claim("LoggedOn", DateTime.Now.ToString()));
            identity.AddClaim(new Claim("Role", roleName));
            context.Validated(identity);
        }
        else
        {
            return;
        }
    }

Вы можете изменить свой ClaimsIdentity oAuthIdentity так же, как мой ClaimsIdentity.

...