。net core 2.0 api中如何使用会话获取和设置值

问题描述 投票:0回答:1

而不是下面的列表。我想从会话中获取用户名和密码

私人列表_users =新列表{新用户{ID = 1,名字=“ Jeevan”,姓氏=“ Nigade”,用户名=“ Jeevan”,密码=“ jeevan”}};

这是我的控制器代码:-

[Route("api")]
[ApiController]
public class UsersController : ControllerBase
{
    private IUserService _userService;

    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpPost("token")]
    public IActionResult Authenticate([FromBody]User userParam)
    {
        //var user
        try
        {
            if (string.IsNullOrEmpty(userParam.Username))
            {
                return StatusCode(400, "Username Cannot Be Null..!!");
            }
            else if (string.IsNullOrEmpty(userParam.Password))
            {
                return StatusCode(400, "Password Cannot Be Null..!!");
            }
            else
            {
                var user = _userService.Authenticate(userParam.Username, userParam.Password);
                if (user == null)
                {
                    return StatusCode(400,"Username or password is incorrect..!!");
                }

                return Ok(user);
            }
        }
        catch(Exception ex)
        {
            return StatusCode(500, ex.Message);
        }
    }

    [Authorize]
    [HttpGet("private")]        
    public IActionResult GetAll()
    {
        var users = _userService.GetAll();
        return Ok(users);
    }   
}

下面是我的类UserServie.cs代码:-公共类UserService:IUserService{

    private List<User> _users = new List<User>
    {
        new User { Id = 1, FirstName = "Jeevan", LastName = "Nigade", Username = "Jeevan", Password = "jeevan" }
    };

    private readonly AppSettings _appSettings;

    public UserService(IOptions<AppSettings> appSettings)
    {
        _appSettings = appSettings.Value;
    }

    public User Authenticate(string username, string password)
    {

       var user = _users.SingleOrDefault(x => x.Username == username && x.Password == password);

        if (user == null)
            return null;

        var tokenHandler = new JwtSecurityTokenHandler();
        var ClientValues = _appSettings.ClientId + _appSettings.ClientSecret;
        var key = Encoding.ASCII.GetBytes(ClientValues);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, user.Id.ToString())
            }),
            //Expires = DateTime.UtcNow.AddSeconds(10),
            Expires = DateTime.Now.AddSeconds(10),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token  = tokenHandler.CreateToken(tokenDescriptor);
        user.Token = tokenHandler.WriteToken(token);

        user.Password = null;

        return user;
    }

    public IEnumerable<User> GetAll()
    {
        return _users.Select(x => {
            x.Password = null;
            return x;
        });
    }


}

我在其中设置列表值的地方。

在此,我可以在哪里以及如何设置会话值,以及如何获取它。

asp.net-core-2.0 asp.net-core-webapi
1个回答
0
投票

从您的代码中,用户列表似乎是所有用户。我建议您可以像下面这样获得它们:

var user = _context.User.ToList();

为您想要设置会话并获取它。这里是一个工作示例,如下所示:

1.Controller.cs

public class UsersController : ControllerBase
{
    private  IUserService _userService;
    public const string SessionKeyName = "user";
    public UsersController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpPost("token")]
    public IActionResult Authenticate([FromBody]User userParam)
    {
        var users = new User { Id = 1, FirstName = "Jeevan", LastName = "Nigade", Username = "Jeevan", Password = "jeevan" };
        HttpContext.Session.SetComplexData(SessionKeyName, users);
        var _users = HttpContext.Session.GetComplexData<User>(SessionKeyName);
        try
        {
            if (string.IsNullOrEmpty(userParam.Username))
            {
                return StatusCode(400, "Username Cannot Be Null..!!");
            }
            else if (string.IsNullOrEmpty(userParam.Password))
            {
                return StatusCode(400, "Password Cannot Be Null..!!");
            }
            else
            {
                var user = _userService.Authenticate(userParam.Username, userParam.Password,_users);
                if (user == null)
                {
                    return StatusCode(400, "Username or password is incorrect..!!");
                }

                return Ok(user);
            }
        }
        catch (Exception ex)
        {
            return StatusCode(500, ex.Message);
        }
    }

    [Authorize]
    [HttpGet("private")]
    public IActionResult GetAll()
    {
        var _users = HttpContext.Session.GetComplexData<User>(SessionKeyName);
        var users = _userService.GetAll(_users);
        return Ok(users);
    }

2.UserService:

public class UserService : IUserService
{
    public User Authenticate(string username, string password,User _users)
    {
        if (_users.Username == username && _users.Password == password)
            return _users;
        return null;
    }

    public User GetAll(User _users)
    {
        return _users;
    }
}

3.IUserService:

public interface IUserService
{
    User Authenticate(string username, string password,User _users);
    User GetAll(User _users);
}

4.SessionExtensions:

public static class SessionExtensions
{
    public static T GetComplexData<T>(this ISession session, string key)
    {
        var data = session.GetString(key);
        if (data == null)
        {
            return default(T);
        }
        return JsonConvert.DeserializeObject<T>(data);
    }

    public static void SetComplexData(this ISession session, string key, object value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }
}

5.Startup.cs:

public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSingleton<IUserService, UserService>();
        services.AddSession();
    }
    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseSession();
        app.UseMvc();
    }
© www.soinside.com 2019 - 2024. All rights reserved.