Asp.net core 带有JWT承载令牌和ASP.NET Core 2 WebApi的Azure AD用户信息
我找到了一个可以使用Azure AD凭据登录我的应用程序的网站 在我的前端,我使用的是Xamarin.Forms。 在我的后端,我使用的是ASP.NET Core 2.0 WebApi 后端:Asp.net core 带有JWT承载令牌和ASP.NET Core 2 WebApi的Azure AD用户信息,asp.net-core,xamarin.forms,jwt,azure-active-directory,asp.net-core-webapi,Asp.net Core,Xamarin.forms,Jwt,Azure Active Directory,Asp.net Core Webapi,我找到了一个可以使用Azure AD凭据登录我的应用程序的网站 在我的前端,我使用的是Xamarin.Forms。 在我的后端,我使用的是ASP.NET Core 2.0 WebApi 后端: public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExce
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"];
});
}
这很简单
在我的前端,我正在填写我的凭证,并要求一个访问令牌
{
"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"
}
我用承载我的访问令牌设置的授权在标题中填充的访问令牌
我的Api知道我所有的信息,因为它会自动使用我的访问令牌中的信息设置声明。此信息由Azure AD提供。(全名、名、名…)
但是如何在前端获取这些信息呢?您可能想在GitHub上查看示例 我展示了如何在桌面应用程序中使用ADAL.NET,为服务获取令牌。您需要为Xamarin forms客户机调整它,但就身份验证而言,原则是相同的。 它还包含一个服务,您可以用自己的服务替换它,并通过将资源ID更改为使用ASP.NET向导创建的应用程序的ID来获取web API的令牌(您可以在Azure门户中找到它,如示例的readme.md中所述) 其思想是首先使用ADAL.Net获取令牌 然后你用它作为一个不记名代币
如果您需要的所有信息都包含在访问令牌中,那么您可以在客户端上解码访问令牌。访问令牌是一个JWT,很容易研究代码样本来解码访问令牌,如以下线程: 如果您还需要更多用户信息,可以刷新Microsoft Graph的访问令牌,并调用Microsoft Graph的
me
端点(请参阅)。下面是关于如何通过刷新令牌刷新访问令牌的文档:
result = await authContext.AcquireTokenAsync(todoListResourceId, clientId, redirectUri, ...)
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);