【发布时间】:2016-12-14 05:15:48
【问题描述】:
我正在使用 C# 实现 .NET Web API 2。这工作正常,我发送用户名和密码并返回一个不记名令牌。
现在令牌用于其他 API 调用,但在每次调用中我都想知道用户数据。这是因为任何应用程序都可以调用 Web API,例如从 python 代码等,在这种情况下,它只会发送不记名令牌而不发送用户名。
我试图挖掘代码但找不到它。
任何想法都将在这里得到最感激。
【问题讨论】:
标签: asp.net-web-api2
我正在使用 C# 实现 .NET Web API 2。这工作正常,我发送用户名和密码并返回一个不记名令牌。
现在令牌用于其他 API 调用,但在每次调用中我都想知道用户数据。这是因为任何应用程序都可以调用 Web API,例如从 python 代码等,在这种情况下,它只会发送不记名令牌而不发送用户名。
我试图挖掘代码但找不到它。
任何想法都将在这里得到最感激。
【问题讨论】:
标签: asp.net-web-api2
这个问题的答案取决于您处理的是什么类型的不记名令牌。例如,如果这是一个 jwt 令牌,那么它由三个部分组成,由句点分隔:标头、有效负载和签名。要从有效负载中获取用户 ID,您需要对有效负载进行 base-64 解码并获取“sub”属性。 “子”被称为“索赔”。令牌包含许多声明,但“子”通常存储用户 ID。有关详细信息,请参阅此:https://jwt.io/introduction/
在 C# 中,您可以使用 String.Split() 解析出令牌的负载,然后像这样对负载进行 base 64 解码:
var payload = Encoding.UTF8.GetString(TextEncodings.Base64Url.Decode(b64Payload));
从那里,您只需将有效负载反序列化为与您期望的格式匹配的对象:
var tokenPayloadObj = JsonConvert.DeserializeObject<YourJwtObjectHere>(payload);
最后,您的用户 ID 应该是您的 jwt 令牌对象的属性:
var userId = tokenPayloadObj.UserId;
【讨论】: