Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 带有JWT承载令牌和ASP.NET Core 2 WebApi的Azure AD用户信息_Asp.net Core_Xamarin.forms_Jwt_Azure Active Directory_Asp.net Core Webapi - Fatal编程技术网

Asp.net core 带有JWT承载令牌和ASP.NET Core 2 WebApi的Azure AD用户信息

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

我找到了一个可以使用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"];
        });
    }
这很简单

在我的前端,我正在填写我的凭证,并要求一个访问令牌

{
"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);