带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息
Posted
技术标签:
【中文标题】带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息【英文标题】:Azure AD User info with JWT Bearer token and ASP.NET Core 2 WebApi 【发布时间】:2018-03-15 12:32:49 【问题描述】:我找到了一个tutorial,我可以在其中使用 Azure AD 凭据登录我的应用程序。
在我的前端中,我使用的是 Xamarin.Forms。 在我的后端,我使用 ASP.NET Core 2.0 WebApi。
后端:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseAuthentication();
app.UseMvc();
public void ConfigureServices(IServiceCollection services)
services.AddMvc();
services.AddAuthentication(o =>
o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
).AddJwtBearer(options =>
options.Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAD:Tenant"]);
options.Audience = Configuration["AzureAd:Audience"];
);
这很简单。
在我的前端,我正在填写我的凭据并要求一个 access_token。
"token_type": "Bearer",
"scope": "user_impersonation",
"expires_in": "3600",
"ext_expires_in": "0",
"expires_on": "1507104075",
"not_before": "1507100175",
"resource": "my_resource",
"access_token": "my_access_token",
"refresh_token": "my_refresh_token"
我用bearer my_access_token
设置的Authorization 填写标题。
我的 Api 知道我的所有信息,因为它会自动使用我的 access_token 中的信息设置声明。此信息由 Azure AD 提供。 (全名,名,姓,...)
但是如何在我的前端获取这些信息?
【问题讨论】:
【参考方案1】:您可能想查看 GitHub 上的 active-directory-dotnet-native-desktop 示例。
我展示了如何在桌面应用程序中使用 ADAL.NET 来获取服务令牌。您需要针对您的 Xamarin 表单客户端进行调整,但就身份验证而言,原理是相同的。 它还包含一个服务,您可以用自己的服务替换它,并通过将资源 ID 更改为使用 ASP.NET 向导创建的应用程序之一来获取 Web API 的令牌(您可以在 Azure 中找到它)示例的 readme.md 中描述的门户)
这个想法是您首先使用 ADAL.Net line 92 of TodoListClient/MainWindow.xaml.cs 获得一个令牌
result = await authContext.AcquireTokenAsync(todoListResourceId, clientId, redirectUri, ...)
然后您将其用作不记名令牌line 121
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
【讨论】:
【参考方案2】:如果您需要的所有信息都包含在访问令牌中,您只需在客户端解码访问令牌即可。访问令牌是一个 JWT,很容易研究代码示例来解码访问令牌,如下线程:
How to decode JWT Token?
Decoding and verifying JWT token using System.IdentityModel.Tokens.Jwt
如果您还需要更多用户信息,您可以刷新 Microsoft Graph 的访问令牌,并调用 Microsoft Graph 的me
端点(参考here)。以下是关于如何通过刷新令牌刷新访问令牌的文档:
Refreshing the access tokens
【讨论】:
以上是关于带有 JWT Bearer 令牌和 ASP.NET Core 2 WebApi 的 Azure AD 用户信息的主要内容,如果未能解决你的问题,请参考以下文章
从 ASP.NET vNext beta5 移动到 beta7 后 JWT Bearer 令牌身份验证错误
将 JWT Bearer Authentication Web API 与 Asp.Net Core 2.0 结合使用的问题
从 ASP.NET Core 中的不同 HTTP 标头读取 JWT 令牌
ASP.Net Core 3.0 JWT Bearer Token 没有 SecurityTokenValidator 可用