UseWindowsAzureActiveDirectoryBearerAuthentication如何在验证令牌时起作用?

Ste*_*d82 12 c# authentication asp.net-web-api

我遵循以下GitHub示例,以实现跨WebApp和WebApi的身份验证机制.

https://github.com/AzureADSamples/WebApp-WebAPI-OpenIDConnect-DotNet

我正在为WebApp和WebApi使用单个App注册,获取" https://abc.onmicrosoft.com/App " 的访问令牌并将其传递给WebApi.我将令牌附加到名为"Bearer"的HTTPS标头.我在WebApi Owin Startup类中有以下内容来验证Audience和Tenant的令牌,但实际上并未按预期验证令牌.

几个问题:1.什么触发下面的处理程序来验证租户和受众的令牌?它是Controller类的[Authorize]属性吗?2.如何找到执行处理程序的令牌?3.将SaveSigninToken设置为true可保存令牌.如何检索令牌并从此令牌获取Graph API的访问令牌?

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
              new WindowsAzureActiveDirectoryBearerAuthenticationOptions
              {
                  Tenant = "abc.onmicrosoft.com",

                  TokenValidationParameters = new TokenValidationParameters
                  {
                      ValidAudience = "https://abc.onmicrosoft.com/App",
                      SaveSigninToken = true,
                  }
              });
Run Code Online (Sandbox Code Playgroud)

请指教.提前致谢!

juu*_*nas 6

是什么触发以下处理程序为租户和受众验证令牌?

中间件Active默认情况下以模式运行,因此它将尝试在每个请求中查找令牌。如果找到一个,它将尝试对其进行验证。如果发现有效,ClaimsPrincipal则创建一个可以在其他OWIN中间件和Web API组件中访问的。

它还会从Azure AD下载用于在启动应用程序时检查令牌签名的公共密钥。如果使用Fiddler之类的工具,则可以看到此信息。

如何在哪里找到执行处理程序的令牌?

我不确定我是否理解这个问题,希望以上我的回答阐明了这一过程。

将SaveSigninToken设置为true将保存令牌。如何获取令牌并从该令牌获取Graph API的访问令牌?

您尝试做的是使用该on-behalf-of流程调用API 。您可以在此处找到示例应用程序:https : //github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof。更具体地说,这部分应该是您感兴趣的:https : //github.com/Azure-Samples/active-directory-dotnet-webapi-onbehalfof/blob/master/TodoListService/Controllers/TodoListController.cs#L133

        ClientCredential clientCred = new ClientCredential(clientId, appKey);
        var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
        string userName = ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn) != null ? ClaimsPrincipal.Current.FindFirst(ClaimTypes.Upn).Value : ClaimsPrincipal.Current.FindFirst(ClaimTypes.Email).Value;
        string userAccessToken = bootstrapContext.Token;
        UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);

        string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
        string userId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
        AuthenticationContext authContext = new AuthenticationContext(authority, new DbTokenCache(userId));

        // In the case of a transient error, retry once after 1 second, then abandon.
        // Retrying is optional.  It may be better, for your application, to return an error immediately to the user and have the user initiate the retry.
        bool retry = false;
        int retryCount = 0;

        do
        {
            retry = false;
            try
            {
                result = await authContext.AcquireTokenAsync(graphResourceId, clientCred, userAssertion);
                accessToken = result.AccessToken;
            }
            catch (AdalException ex)
            {
                if (ex.ErrorCode == "temporarily_unavailable")
                {
                    // Transient error, OK to retry.
                    retry = true;
                    retryCount++;
                    Thread.Sleep(1000);
                }
            }
        } while ((retry == true) && (retryCount < 1));
Run Code Online (Sandbox Code Playgroud)


Ste*_*d82 -1

控制器中的 [Authorize] 装饰或我们指定的任何方法都会触发 Owin 安全处理程序来验证令牌并生成声明。

  • 这个答案不正确。身份验证中间件在每个请求上运行。中间件组件至少在启动时从 Azure AD 下载公钥,并使用该信息来验证传入的令牌。如果它在请求中找到有效令牌,它会从中构造一个 ClaimsPrincipal 来识别用户。`AuthorizeAttribute` 只是检查用户的身份,如果身份验证成功完成,该身份就会存在。 (2认同)