如何在Web API中验证我从WPF客户端接收的访问令牌
本文关键字:客户端 客户 WPF 端接 访问令牌 Web API 验证 | 更新日期: 2023-09-27 17:50:33
我正在构建两个应用程序,WPF和Web API。
WPF连接到身份服务器(现在是Azure AD)并获取访问令牌,然后将其发送到我的Web API以获取数据。
如何在Web API中验证访问令牌以确保它是正确的??
现在我正在使用Azure,但我应该构建能够验证来自任何身份提供者的任何访问令牌。
有例子或文章解释这个吗?
谢谢
遇到了同样的问题。
决定使用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;
}