Asp.net core 在ASP.NET Core 2.0中使用OpenID Connect时,AdalDistributedTokenCache是什么?
这里显示的代码是我尝试在ASP.NET Core 2.0中对我的Azure AD租户执行身份验证的代码 有趣的部分是我在收到身份验证代码后的下一组目标 我希望将经过身份验证的用户的广告组放入声明中,并将它们传递给我基于策略的授权注册 为了实现这一点,我将授权代码交换为访问令牌 获得访问令牌后,我使用MicrosoftGraphSDK检索经过身份验证的用户的广告组 问题1:我见过访问令牌存储在缓存Asp.net core 在ASP.NET Core 2.0中使用OpenID Connect时,AdalDistributedTokenCache是什么?,asp.net-core,asp.net-identity,azure-active-directory,openid-connect,azure-ad-graph-api,Asp.net Core,Asp.net Identity,Azure Active Directory,Openid Connect,Azure Ad Graph Api,这里显示的代码是我尝试在ASP.NET Core 2.0中对我的Azure AD租户执行身份验证的代码 有趣的部分是我在收到身份验证代码后的下一组目标 我希望将经过身份验证的用户的广告组放入声明中,并将它们传递给我基于策略的授权注册 为了实现这一点,我将授权代码交换为访问令牌 获得访问令牌后,我使用MicrosoftGraphSDK检索经过身份验证的用户的广告组 问题1:我见过访问令牌存储在缓存IDistributedCache中的示例。为什么这一点很重要?不执行此步骤会有什么风险?AdalDi
IDistributedCache
中的示例。为什么这一点很重要?不执行此步骤会有什么风险?AdalDistributedTokenCache到底是什么
e、 g
我发现访问令牌总是通过
string accessToken = await HttpContext.GetTokenAsync("access_token");
问题2:检索组后,如果我将这些组作为声明添加到主体中,那么我是否可以使用它们来驱动授权策略,如本文所述
问题3:访问令牌和id令牌以及我添加的声明是否最终会出现在cookie中
问题4:我如何强制Azure AD以声明的形式返回广告角色(而不是通过图表获得的组),而不必更改某种清单
完整代码
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
Configuration.GetSection("OpenIdConnect").Bind(options);
options.SaveTokens = true;
options.Events = new OpenIdConnectEvents
{
OnAuthorizationCodeReceived = async ctx =>
{
// Exchange authorization code for access token
var request = ctx.HttpContext.Request;
var currentUri = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);
var authContext = new AuthenticationContext(ctx.Options.Authority);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
ctx.ProtocolMessage.Code, new Uri(currentUri), credential, ctx.Options.Resource);
// Use Microsoft Graph SDK to retrieve AD Groups
var email = ctx.Principal.Claims.First(f => f.Type == ClaimTypes.Upn).Value;
GraphServiceClient client = new GraphServiceClient(
new DelegateAuthenticationProvider(
async requestMessage => {
var accessToken = result.AccessToken;
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
}));
var groups = await client.Users[email].GetMemberGroups(false).Request()
.PostAsync();
// Do something with groups
ctx.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
};
});
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Index");
});
}
问题1:我见过访问令牌存储在缓存IDistributedCache
中的示例。为什么这一点很重要?不执行此步骤会有什么风险?AdalDistributedTokenCache到底是什么
默认情况下,ADAL使用内存内令牌缓存,它在其中保留所获取的访问和刷新令牌。
通过使用由Redis等支持的分布式缓存,承载应用程序的所有实例都可以访问令牌缓存。
如果应用程序在负载平衡器后面运行,这是必需的,并且还可以防止应用程序重新启动时数据丢失
问题2:检索组后,如果我将这些组作为声明添加到主体中,那么我是否可以使用它们来驱动授权策略,如本文所述
您可以在用户主体上添加新标识,类似于我的文章:。
如果您在OnAuthorizationCodeReceived
处理程序中添加标识,那么它应该可以工作。
它们将使用默认的登录方案存储为声明,在您的案例中是Cookies。
所以,是的,你可以在政策中使用它们
问题3:访问令牌和id令牌以及我添加的声明是否最终会出现在cookie中
是的,它们都保存在cookie中。
但是,您应该在需要时使用ADAL来获取访问令牌。
在您的情况下,只要正确设置ADAL令牌缓存,就不需要保存令牌的选项
获取令牌:
使用令牌:
示例应用程序首先为登录用户创建令牌缓存。
然后,我们使用ADAL的AcquireTokenSilentAsync
方法以静默方式获取访问令牌。
这意味着ADAL将返回缓存的访问令牌,或者如果它已过期,则使用缓存的刷新令牌获取新的访问令牌。
如果这两个都失败,将引发异常。
对于示例应用程序,有一个异常过滤器,用于捕获异常并重定向用户登录:
问题4:我如何强制Azure AD以声明的形式返回广告角色(而不是通过图表获得的组),而不必更改某种清单
如果你指的是像全局管理员这样的角色,你就不能在声明中得到它。
您在应用程序清单中定义并分配给用户/组的角色始终包含在令牌中 是否有可能每次都再次请求访问令牌而不是缓存?在哪里最好?我之所以这样问,是因为我正在使用IdentityServer从一个项目进行传输,该服务器使用代表流并在每个请求中获取新的访问令牌。仍然不确定如果我每次都能检索到新的访问令牌,为什么要使用令牌缓存?我这样问是因为这可能是我在获取代币时会做的事情。我决定缓存的特定访问令牌有什么特别之处?我认为您无法使用过期的访问令牌获得新的访问令牌。您需要为此使用刷新令牌。将其保存在令牌缓存中可以让您获得这些新的访问令牌。访问令牌被缓存以避免不必要的依赖调用。嗯,在进一步思考您的问题之后,我明白了您的API观点,因为您总是从调用方获得一个新的令牌。在这种情况下,令牌缓存只允许您在每次调用API时避免该依赖项调用。尽管如此,您也确实需要使用内存缓存,因为否则您只需将一个依赖项调用替换为另一个:D
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
Configuration.GetSection("OpenIdConnect").Bind(options);
options.SaveTokens = true;
options.Events = new OpenIdConnectEvents
{
OnAuthorizationCodeReceived = async ctx =>
{
// Exchange authorization code for access token
var request = ctx.HttpContext.Request;
var currentUri = UriHelper.BuildAbsolute(request.Scheme, request.Host, request.PathBase, request.Path);
var credential = new ClientCredential(ctx.Options.ClientId, ctx.Options.ClientSecret);
var authContext = new AuthenticationContext(ctx.Options.Authority);
var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
ctx.ProtocolMessage.Code, new Uri(currentUri), credential, ctx.Options.Resource);
// Use Microsoft Graph SDK to retrieve AD Groups
var email = ctx.Principal.Claims.First(f => f.Type == ClaimTypes.Upn).Value;
GraphServiceClient client = new GraphServiceClient(
new DelegateAuthenticationProvider(
async requestMessage => {
var accessToken = result.AccessToken;
requestMessage.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
}));
var groups = await client.Users[email].GetMemberGroups(false).Request()
.PostAsync();
// Do something with groups
ctx.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
};
});
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Index");
});
}