使用JWT Bearer令牌和ASP.NET Core 2 WebApi的Azure AD用户信息

时间:2017-10-04 07:31:56

标签: asp.net-core xamarin.forms jwt azure-active-directory asp.net-core-webapi

我找到了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"
}

access_token我填写了标题,其中授权设置为bearer my_access_token

我的Api知道我的所有信息,因为它会使用我的access_token中的信息自动设置声明。此信息由Azure AD提供。 (全名,名字,姓氏,......)

但是我怎样才能在我的前端得到这些信息呢?

2 个答案:

答案 0 :(得分:0)

您可能想查看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);

答案 1 :(得分:0)

如果您需要的所有信息都包含在访问令牌中,您只需解码客户端上的访问令牌即可。访问令牌是一个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