如何在Web API中验证我从WPF客户端接收的访问令牌

本文关键字:客户端 客户 WPF 端接 访问令牌 Web API 验证 | 更新日期: 2023-09-27 17:50:33

我正在构建两个应用程序,WPF和Web API。
WPF连接到身份服务器(现在是Azure AD)并获取访问令牌,然后将其发送到我的Web API以获取数据。

如何在Web API中验证访问令牌以确保它是正确的??
现在我正在使用Azure,但我应该构建能够验证来自任何身份提供者的任何访问令牌。

有例子或文章解释这个吗?

谢谢

如何在Web API中验证我从WPF客户端接收的访问令牌

遇到了同样的问题。

决定使用JWTToken

我的建筑是下一个

前端<-> WebApi <->数据库

前端是在MVC4 WebApi2

前端将使用FormAuthentication方法。一旦用户完全登录,保存JWT令牌,然后在我向webapi发出的每个请求上发送身份验证头。

前端部分将只携带加密的JWT令牌,不会从中解密任何内容。只发送令牌到认证http头标记。

在webapi端,每个请求都缓存到DelegatingHandle中,检查被调用的方法是否需要授权,验证JWTToken,然后做webapi方法所做的事情。

我不能把我的部分代码发给你,因为它现在属于我的公司,但我可以给你链接一些网络阅读:)

1 - JWT

2 - ASP。. Net Web API与JWT (webapi处理程序)

你必须在你的webapi方法上使用[authorization]或[AllowAnonymous]标签。你甚至可以创建你自己的标签来处理所有的组的事情。

如果你有更多的问题,请随时提问:)

我想这将回答你99%的安全问题。

我知道这是一个一年的问题,但我希望这个答案能帮助其他用户:)

客户端代码

public async void Authenticate(string aadInstance, string tenant, string clientId, Uri redirectUri, string resourceId)
        {
            try
            {
                string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
                authContext = new AuthenticationContext(authority, new FileCache());
                AuthenticationResult result = null;
                try
                {
                    result = await authContext.AcquireTokenSilentAsync (resourceId, clientId);
                }
                catch (AdalException ex)
                {
                    if (ex.ErrorCode == AdalError.UserInteractionRequired || ex.ErrorCode == AdalError.FailedToAcquireTokenSilently)
                    {
                        result = await authContext.AcquireTokenAsync(resourceId, clientId, redirectUri, new PlatformParameters(PromptBehavior.Always));
                    }
                }
                ticket = result.AccessToken;
                user = result.UserInfo.DisplayableId.Split('@')[0];
            }
            catch (Exception ex)
            {
                ticket = "Error";
                throw ex;
            }
        }

服务器端代码

using System.IdentityModel.Tokens.Jwt;
using Microsoft.IdentityModel.Tokens;
using Microsoft.IdentityModel.Protocols;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
private JwtSecurityToken Validate(string token)
        {
            string stsDiscoveryEndpoint = "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration";
            ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());
            OpenIdConnectConfiguration config = configManager.GetConfigurationAsync().Result;
            TokenValidationParameters validationParameters = new TokenValidationParameters
            {
                ValidateAudience = false,
                ValidateIssuer = false,
                IssuerSigningKeys = config.SigningKeys, //.net core calls it "IssuerSigningKeys" and "SigningKeys"
                ValidateLifetime = true
            };
            JwtSecurityTokenHandler tokendHandler = new JwtSecurityTokenHandler();
            SecurityToken jwt;
            var result = tokendHandler.ValidateToken(token, validationParameters, out jwt);
            return jwt as JwtSecurityToken;
        }