91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

asp.net jwt 怎樣進行令牌存儲

小樊
81
2024-11-29 00:58:32
欄目: 云計算

在ASP.NET中使用JWT(JSON Web Token)進行身份驗證時,令牌的存儲和管理是一個重要的環節。以下是一些常見的令牌存儲方法:

1. 內存存儲

這是最簡單的方法,但也是最不安全的,因為令牌會存儲在內存中,如果應用程序重啟,令牌將丟失。

public class InMemoryTokenStore : ITokenStore
{
    private readonly Dictionary<string, string> _tokens = new Dictionary<string, string>();

    public void SaveToken(string username, string token)
    {
        _tokens[username] = token;
    }

    public string GetToken(string username)
    {
        return _tokens.TryGetValue(username, out var token) ? token : null;
    }

    public void RemoveToken(string username)
    {
        _tokens.Remove(username);
    }
}

2. 數據庫存儲

將令牌存儲在數據庫中可以提供更持久性和安全性,但需要額外的配置和代碼來管理數據庫連接和操作。

public class DatabaseTokenStore : ITokenStore
{
    private readonly ApplicationDbContext _context;

    public DatabaseTokenStore(ApplicationDbContext context)
    {
        _context = context;
    }

    public async Task SaveTokenAsync(string username, string token)
    {
        var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username);
        if (user != null)
        {
            user.JwtToken = token;
            await _context.SaveChangesAsync();
        }
    }

    public async Task<string> GetTokenAsync(string username)
    {
        var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username);
        return user?.JwtToken;
    }

    public async Task RemoveTokenAsync(string username)
    {
        var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == username);
        if (user != null)
        {
            user.JwtToken = null;
            await _context.SaveChangesAsync();
        }
    }
}

3. 分布式緩存存儲

使用分布式緩存(如Redis)可以提供更高效的令牌存儲和管理,特別是在微服務架構中。

public class RedisTokenStore : ITokenStore
{
    private readonly IDistributedCache _cache;

    public RedisTokenStore(IDistributedCache cache)
    {
        _cache = cache;
    }

    public async Task SaveTokenAsync(string username, string token)
    {
        var options = new DistributedCacheEntryOptions
        {
            AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(30)
        };
        await _cache.SetStringAsync(username, token, options);
    }

    public async Task<string> GetTokenAsync(string username)
    {
        return await _cache.GetStringAsync(username);
    }

    public async Task RemoveTokenAsync(string username)
    {
        await _cache.RemoveAsync(username);
    }
}

4. HttpOnly Cookie 存儲

將JWT令牌存儲在HttpOnly Cookie中可以防止客戶端JavaScript訪問令牌,從而提高安全性。

public class JwtCookieTokenStore : ITokenStore
{
    private readonly IHttpContextAccessor _contextAccessor;

    public JwtCookieTokenStore(IHttpContextAccessor contextAccessor)
    {
        _contextAccessor = contextAccessor;
    }

    public void SaveToken(string username, string token)
    {
        var context = _contextAccessor.HttpContext;
        var cookieOptions = new CookieOptions
        {
            HttpOnly = true,
            IsEssential = true,
            SameSite = SameSiteMode.Strict,
            Expires = DateTimeOffset.UtcNow.AddMinutes(30)
        };
        context.Response.Cookies.Append("jwt", token, cookieOptions);
    }

    public string GetToken()
    {
        var context = _contextAccessor.HttpContext;
        return context.Request.Cookies["jwt"];
    }

    public void RemoveToken()
    {
        var context = _contextAccessor.HttpContext;
        context.Response.Cookies.Delete("jwt");
    }
}

總結

選擇哪種存儲方法取決于你的具體需求和環境。內存存儲最簡單但最不安全;數據庫存儲提供了持久性和安全性但需要額外的配置;分布式緩存存儲在微服務架構中表現優異;HttpOnly Cookie存儲可以提高安全性但需要處理Cookie相關的問題。

0
汉寿县| 中山市| 泰兴市| 麻阳| 迁安市| 泸溪县| 巴南区| 垣曲县| 梁河县| 遂川县| 和田县| 淮滨县| 庆云县| 旅游| 桐梓县| 阿合奇县| 鹤岗市| 阿瓦提县| 浙江省| 儋州市| 澳门| 梁河县| 吉木萨尔县| 莆田市| 垦利县| 新余市| 明光市| 马鞍山市| 朝阳县| 阿荣旗| 太谷县| 海门市| 乳山市| 六安市| 汉中市| 远安县| 青冈县| 洛南县| 葫芦岛市| 仁寿县| 瑞安市|