带有 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 可用

如何更改 asp.net core 1 中的令牌响应?

使用 JWT Bearer 令牌进行身份验证 Swagger