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

c# wpf azure asp.net-web-api

543 观看

2回复

1673 作者的声誉

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

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

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

谢谢

作者: Dabbas 的来源 发布者: 2015 年 5 月 22 日

回应 (2)


0

794 作者的声誉

遇到了同样的问题。

我决定使用JWTToken

我的架构是下一个

前< - > WebApi < - >数据库

前面是MVC4 WebApi2

前面将使用FormAuthentication方法。用户完全记录后保存JWT令牌,然后在我对webapi执行的每个请求上发送Authentication Header。

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

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

我不能把你的部分代码发给你,因为这对我的公司来说是现在的响亮,但是我可以给你链接一些互联网读数:)

1 - JWT

2- 带有JWT的ASP.Net Web API(webapi处理程序)

然后,您必须使用webapi方法上的[Authorize]或[AllowAnonymous]标记。您甚至可以创建自己的标签来处理所有组的事情。

如果您有更多问题,请随时问:)

我认为这将回答99%的安全问题。

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

作者: pix 发布者: 04.10.2016 11:56

0

6 作者的声誉

客户端代码

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;
        }
作者: Sijoy Rajan 发布者: 06.06.2019 01:54
32x32