【问题标题】:How to authenticate/validate JWT for accessing data WCF asp.net如何验证/验证 JWT 以访问数据 WCF asp.net
【发布时间】:2020-10-22 16:21:28
【问题描述】:

我偶然发现使用带有安全令牌 Json Web Token (JWT) 的 WCF RESTful API。我已经为用户创建了注册和登录(在这里创建了 jwt)服务。现在我不确定如何在访问数据时对用户的每个请求进行 JWT 身份验证。 这是我创建 JWT 所遵循的链接。

https://www.c-sharpcorner.com/article/wcf-service-with-jwt-token/

这是带有用户信息和 JWT 的响应对象

{  
  "response": "true",  
  "UData": {  
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoibWxpYXFhdDQxNUBnbWFpbC5jb20iLCJwYXNzIjoiMzMzIiwiaWF0IjoiMTU5MzYwNTY0MCJ9.JAeBj0VAJJtCVwbTMrgz_F6ZQWdjYcZFUsif5qLHPGo",  
    "authenticated": true,  
    "UserID": "4",  
    "FullName": "Hellen Waock",  
    "UNo": null,  
    "Email": "hellenwaockofficial@gmail.com",  
    "timestamp": "2020-07-01T17:14:00.355758+05:00"  
  }  
}

现在我正在为 get_AllUsers 创建服务,但我想在访问 get_AllUsers 时使用 JWT。 还有一点要问,在我遵循的上述链接中,我找到了一行代码粘贴到 webconfig 中,我将其粘贴到了各种标签中但出现了一些错误,任何人都可以帮忙粘贴该行的位置。 提前致谢

【问题讨论】:

  • 你能发布你的错误吗?
  • 在上面的链接中,我找到了一行代码要粘贴到 webconfig 中,我将其粘贴到各种标签中但出现了一些错误 - 恐怕几乎没有人将阅读链接的文章以找出您可能指的是哪一行以及它可能导致的错误。请将直接属于您的问题的所有信息添加到问题本身中。告诉我们你把它放在哪一行和哪里以及它导致了什么错误。

标签: c# asp.net web-services jwt wcf-security


【解决方案1】:

你可以对得到的JWT进行解码,解码后你会得到编码前的数据,然后你可以验证这个数据。在你的项目中,你可以在调用get_AllUsers之前对得到的JWT进行解码,然后验证解码后的数据。

链接中的JWT解码方法如下:

public string DeJwt(string token) { 
    byte[] secretKey = Base64UrlDecode("Hi");
    string Json = Jose.JWT.Decode(token, secretKey);
    return Json;
}

返回的json是解码后的数据,包括用户名和密码,可以验证一下。

Jose-JWT 有其他编码和解码方法。链接中的示例只是其中之一。您可以参考以下链接了解更多信息:

https://github.com/dvsekhvalnov/jose-jwt

web.config 中收到错误是因为添加了以下代码行吗?

<serviceAuthorization serviceAuthorizationManagerType="WcfService1.DistributorValidator, WcfService"/>

这行代码应该添加到服务的行为中,如下所示:

    <serviceBehaviors>
        <behavior name="ServiceBehavior">
            <serviceAuthorization serviceAuthorizationManagerType="Demo_rest_ConsoleApp.DistributorValidator, Demo-rest-ConsoleApp"/>
            <serviceMetadata httpGetEnabled="true"/>
        </behavior>
    </serviceBehaviors>

更新

在 WCF 中,您可以通过实现 IDispatchMessageInspector 接口来拦截所有请求。

public class ServerMessageLogger : IDispatchMessageInspector
    {
        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {

            return null;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
           
        }
    }

您可以在 AfterReceiveRequest 方法中处理所有传入的请求。

最后需要将ServerMessageLogger添加到服务行为中并应用到服务中。

如果不确定如何将ServerMessageLogger添加到服务中,可以参考这个链接:

How to enable Cross-Origin Resource Sharing in .Net Console Application WCF Service?

【讨论】:

  • 谢谢,但是请告诉我如何在全局范围内跟踪所有请求(除了用户登录请求,因为它是用户 jwt 的开始),因为每个请求都将被过滤,如果发现正确(已授权)然后将给出数据访问权限,否则响应将是 401,我应该使用 Global.asax 并在应用程序启动时添加吗?
  • @jps你说的没错,默认的JWT确实没有加密,我已经修改了我的回复。
  • 已解码,获得用户,通过 & iat,在哪里验证? public static string GetJwt(string user, string pass) { byte[] secretKey = Base64UrlDecode("Hi"); DateTime issued = DateTime.Now; var User = new Dictionary&lt;string, object&gt;() { {"user", user}, {"pass", pass}, {"iat", ToUnixTime(issued).ToString()} }; string token = JWT.Encode(User, secretKey, JwsAlgorithm.HS256); return token; }
  • 上述代码是为了确认这个token是否存储在字典中,验证时我们可以将解码后的信息与字典元素进行比较?或者我们必须进行数据库查询(这种方法不满足我)。
  • 解码JWT后,您可以根据自己的需求验证JWT。例如,您提到将 JWT 存储在字典中。这需要您创建字典并存储它。我想到的验证方法是,可以在客户端每次调用时传入UserID和JWT,将JWT解码后得到的UserID与传入的UserID进行比较,如果两个UserID相同,则验证通过。
猜你喜欢
  • 2022-10-15
  • 2021-08-24
  • 2015-02-13
  • 2019-10-20
  • 2017-12-02
  • 2020-05-18
  • 2014-05-29
  • 2018-06-18
  • 2017-05-13
相关资源
最近更新 更多