c# - 带有 OWIN 的 webapi 中的复杂 JSON Web token 数组

标签 c# asp.net-web-api oauth-2.0 asp.net-web-api2 jwt

我正在尝试学习 JWT 和 ouath。我遇到了 JWT 的形式,它可以帮助我开发我的授权服务器。

我遇到的格式如下:

{
  iat: 1416929061, 
  jti: "802057ff9b5b4eb7fbb8856b6eb2cc5b",
  scopes: {
    users: {
      actions: ['read', 'create']
    },
    users_app_metadata: {
      actions: ['read', 'create']
    }
  }
}

然而,由于在添加声明时我们只能添加简单的字符串,如何实现这样的事情呢?

到目前为止我看到的唯一方法是使用 JSON.serialization - 来自 https://stackoverflow.com/a/27279400/2476347

new Claim(someClass,JsonConvert.SerializeObject(result)

任何指南将不胜感激!谢谢!

用于测试的代码

我想在 JWT 中使用的类

public class MyTes
{
    public string       area { get; set; }
    public List<string> areapermissions { get; set; }
}

然后我使用以下代码生成 token

        var identity = new ClaimsIdentity("JWT");

        var cos = new List<string>();

        cos.Add("aaa");
        cos.Add("bbb");

        MyTes vario = new MyTes()
        {
            area = "someregion",
            areapermissions = cos
        };




        identity.AddClaim(new Claim(ClaimTypes.Name, context.UserName));
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim(ClaimTypes.Role, "Manager"));
        identity.AddClaim(new Claim(ClaimTypes.Role, "Supervisor"));
        identity.AddClaim(new Claim("scope", "xyz1"));
        identity.AddClaim(new Claim("scope", "xyz2"));
        identity.AddClaim(new Claim("scope", "xyz3"));
        identity.AddClaim(new Claim("APIs", JsonConvert.SerializeObject(cos)));
        identity.AddClaim(new Claim("APIs2", JsonConvert.SerializeObject(vario)));

这没有错误,当我解码我现在得到的票时:

{
  "unique_name": "Rafski",
  "sub": "Rafski",
  "role": [
    "Manager",
    "Supervisor"
  ],
  "scope": [
    "xyz1",
    "xyz2",
    "xyz3"
  ],
  "APIs": "[\"aaa\",\"bbb\"]",
  "APIs2": "{\"area\":\"someregion\",\"areapermissions\":[\"aaa\",\"bbb\"]}",
  "iss": "http://kurwa.mac",
  "aud": "7aaa70ed8f0b4807a01596e2abfbd44d",
  "exp": 1429351056,
  "nbf": 1429349256
}

最佳答案

以下是如何使用 .Net 创建具有复杂 JSON 声明的 JWT token 。

使用Nuget获取库:System.IdentityModel.Tokens.Jwt

然后使用以下代码创建 JWT token 。

var keybytes = Convert.FromBase64String(YOUR_CLIENT_SECRET);
        var signingCredentials = new SigningCredentials(
                    new InMemorySymmetricSecurityKey(keybytes),
                    SecurityAlgorithms.HmacSha256Signature,
                    SecurityAlgorithms.Sha256Digest);

        var nbf = DateTime.UtcNow.AddSeconds(-1);
        var exp = DateTime.UtcNow.AddSeconds(120);
        var payload = new JwtPayload(null, "", new List<Claim>(), nbf, exp);

        var users = new Dictionary<string, object>();
        users.Add("actions", new List<string>() { "read", "create" });
        var scopes = new Dictionary<string, object>();
        scopes.Add("users", users);
        payload.Add("scopes", scopes);

        var jwtToken = new JwtSecurityToken(new JwtHeader(signingCredentials), payload);
        var jwtTokenHandler = new JwtSecurityTokenHandler();
        return jwtTokenHandler.WriteToken(jwtToken);

这会产生一个 token ,例如

{
  "typ": "JWT",
  "alg": "HS256"
}    
{
      "exp": 1433254394,
      "nbf": 1433254273,
      "scopes": {
        "users": {
          "actions": [
            "read", "create"
          ]
        }
      }
    }

关于c# - 带有 OWIN 的 webapi 中的复杂 JSON Web token 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29715178/

相关文章:

spring - 在 Spring OAuth2 中,为什么即使我在资源服务器中标记了我的资源,它仍然不 protected ?

c# - 如何在具有动画器的游戏对象之外添加动画事件接收器/监听器?

c# - 当其中一个函数具有带约束的泛型参数时,无法声明两个同名函数

c# - Linq - OrderBy 使用 lambda 表达式的两列的最小值?

asp.net-mvc - WebAPI 接口(interface)版本控制的推荐实践

mysql - 使用实体和 WebAPI 2 的 ASP.NET 上没有 'Access-Control-Allow-Origin' 错误

json - 无法接受 XDomainRequest POST 到 WebAPI

c# - 如何保留 DotNetOpenAuth OAuth2 刷新和访问 token

python - Oauth2 lib 无法导入名称 'run'

c# - 支持模拟以委托(delegate)为参数的方法的模拟框架