Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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 在ASP.NET Core 2.0中使用OpenID Connect时,AdalDistributedTokenCache是什么?_Asp.net Core_Asp.net Identity_Azure Active Directory_Openid Connect_Azure Ad Graph Api - Fatal编程技术网

Asp.net core 在ASP.NET Core 2.0中使用OpenID Connect时,AdalDistributedTokenCache是什么?

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

这里显示的代码是我尝试在ASP.NET Core 2.0中对我的Azure AD租户执行身份验证的代码

有趣的部分是我在收到身份验证代码后的下一组目标

我希望将经过身份验证的用户的广告组放入声明中,并将它们传递给我基于策略的授权注册

为了实现这一点,我将授权代码交换为访问令牌

获得访问令牌后,我使用MicrosoftGraphSDK检索经过身份验证的用户的广告组

问题1:我见过访问令牌存储在缓存
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");
                  });
    }