如何在 .NET Core 中进行代授权(缺少 BootstrapContext)?
How to do on-behalf-of auth in .NET Core (missing BootstrapContext)?
我 运行 .NET 4.5 中的代理示例:
https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof
但我需要在 .NET Core 中做同样的事情。当尝试将示例服务移植到 .NET 核心时,除此行外的所有内容都会编译:
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
无法编译,因为 System.IdentityModel 在 .NET Core 中不可用。
我发现如果我使用此代码获取用户访问令牌和用户名,它适用于 与服务相同 租户中的用户:
System.Security.Claims.ClaimsIdentity identity =
User.Identity as System.Security.Claims.ClaimsIdentity;
string userAccessToken = identity.BootstrapContext as string;
string userName = (User.FindFirst(ClaimTypes.Upn))?.Value;
但是对于不同租户中的用户(多租户认证),userAccessToken和userName设置为null。我需要做些什么不同的事情才能让来自不同租户的用户正常工作?
不使用BootstrapContext
class来获取access_token,我们可以直接在控制器中使用HttpContext
来获取原始的access_token通过以下代码:
var orignalToken = HttpContext.Request.Headers["authorization"][0].Split(' ')[1];
我发现 userAccessToken 和 userName 返回为 null 的原因是因为我在 Startup.cs 中调用 UseJwtBearerAuthentication 时缺少 SaveSigninToken 参数:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Authority = String.Format(CultureInfo.InvariantCulture, Configuration["Authentication:AzureAd:AADInstance"], Configuration["Authentication:AzureAd:Tenant"]),
Audience = Configuration["Authentication:AzureAd:Audience"],
TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true, ValidateIssuer = false }
});
在没有 SaveSigninToken = true 的情况下,如果调用者来自另一个租户,则调用者的访问令牌和身份不会流过。
我 运行 .NET 4.5 中的代理示例:
https://github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof
但我需要在 .NET Core 中做同样的事情。当尝试将示例服务移植到 .NET 核心时,除此行外的所有内容都会编译:
var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
无法编译,因为 System.IdentityModel 在 .NET Core 中不可用。
我发现如果我使用此代码获取用户访问令牌和用户名,它适用于 与服务相同 租户中的用户:
System.Security.Claims.ClaimsIdentity identity =
User.Identity as System.Security.Claims.ClaimsIdentity;
string userAccessToken = identity.BootstrapContext as string;
string userName = (User.FindFirst(ClaimTypes.Upn))?.Value;
但是对于不同租户中的用户(多租户认证),userAccessToken和userName设置为null。我需要做些什么不同的事情才能让来自不同租户的用户正常工作?
不使用BootstrapContext
class来获取access_token,我们可以直接在控制器中使用HttpContext
来获取原始的access_token通过以下代码:
var orignalToken = HttpContext.Request.Headers["authorization"][0].Split(' ')[1];
我发现 userAccessToken 和 userName 返回为 null 的原因是因为我在 Startup.cs 中调用 UseJwtBearerAuthentication 时缺少 SaveSigninToken 参数:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Authority = String.Format(CultureInfo.InvariantCulture, Configuration["Authentication:AzureAd:AADInstance"], Configuration["Authentication:AzureAd:Tenant"]),
Audience = Configuration["Authentication:AzureAd:Audience"],
TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true, ValidateIssuer = false }
});
在没有 SaveSigninToken = true 的情况下,如果调用者来自另一个租户,则调用者的访问令牌和身份不会流过。