【问题标题】:How to create multiple tokens for different client type in ASP .NET Web API如何在 ASP .NET Web API 中为不同的客户端类型创建多个令牌
【发布时间】:2017-07-03 18:44:42
【问题描述】:

我正在开发一个带有 Web API 和不同客户端(移动应用程序、浏览器)的应用程序。我想为同一用户的每种客户端类型使用不同的访问令牌。原因是,用户可以从一台设备上退出,但在其他设备上保持登录状态(类似于 Facebook 的情况)。

我知道 ASP .Net 身份框架会为用户生成单个令牌,而不管客户端类型。有没有其他框架?还是必须通过在数据库中存储一些客户详细信息来完成?

【问题讨论】:

  • 得出任何结论了吗?
  • 我已经开始实施您建议的实施。将很快更新。在旁注中,对于注销人们说忘记了客户端的令牌。还有比这更安全的方法吗?
  • 在客户端忘记令牌是一种很好的做法。除了在服务器上设置更短的令牌到期时间会更好。
  • 另一个改进是实现刷新令牌。
  • 我也意识到我需要处理用户更改密码的情况。然后需要使所有其他令牌无效并强制重新登录。

标签: c# asp.net asp.net-web-api asp.net-identity access-token


【解决方案1】:

您可以手动创建令牌,届时您可以向令牌添加声明并将其返回给客户端。一旦客户端向服务器发出请求,您就可以从令牌中提取声明并决定设备类型。

创建如下令牌:

var identity = new ClaimsIdentity(Startup.OAuthOptions.AuthenticationType);

AuthenticationTicket ticket = new AuthenticationTicket(identity, new AuthenticationProperties());
var currentUtc = new SystemClock().UtcNow;
identity.AddClaim(new Claim("device_type", "android/ios/web"));

ticket.Properties.IssuedUtc = currentUtc;
var expiryInterval = int.Parse("20");

var access_token = Startup.OAuthOptions.AccessTokenFormat.Protect(ticket);

请求中的访问令牌和来自令牌的声明如下所述:

ClaimsPrincipal principal = Request.GetRequestContext().Principal as ClaimsPrincipal;
var customClaimValue = principal.Claims.Where(c => c.Type == "device_type").Single().Value;

“customClaimValue”必须包含您的设备类型。

【讨论】:

    【解决方案2】:

    我相信为不同的客户生成不同的令牌对于实现您的目标是不必要的。首先,在 asp.net 中,为 /token 端点的每个令牌请求发出一个新的不记名令牌。

    因此,每个客户端都会为每个请求颁发不同的令牌。然后客户端(网络、移动或任何其他)可以保存令牌并使用它来访问授权资源。注销只是在客户端忘记令牌的问题。

    注意:出于安全原因,请记住发出具有短暂到期时间的令牌,并且您可以使用刷新令牌结束在过期后发出新令牌。

    【讨论】:

    • 用户登录时必须生成新的refreshtoken和accesstoken。因此,设备必然有不同的token关联到用户帐户。你说的没有任何意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2014-11-17
    • 2019-02-20
    • 2015-12-17
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    相关资源
    最近更新 更多