UseWindowsAzureActiveDirectoryBearerAuthentication和UseOpenIdConnectAuthentication有什么区别?

时间:2018-10-14 10:32:52

标签: c# .net azure azure-active-directory

我有已在Azure AD中注册的webapi。 在Startup.Auth.cs中具有以下代码

   public void ConfigureAuth(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                Authority = Authority,
                PostLogoutRedirectUri = PostLogoutRedirectUri
            });

当我在浏览器中运行此webapi时,它要求登录,登录成功后便能够查看所有api的网址。

我正在尝试从注册到同一天蓝色AD的Web应用访问此安全api。

当我在Webapp中使用AcquireTokenAsync来为此Webapi生成访问令牌时,它可以工作,但会提供登录HTML页面作为响应。

为避免这种情况,我尝试使用AcquireTokenSilentAsync生成静默令牌,但发生了unable to generate token cache not found异常,但在那里发现缓存键仍然异常。

一些google git post建议在WebApi中使用UseWindowsAzureActiveDirectoryBearerAuthentication此代码后,他们说当从webapp调用而不是登录页面输出时,它将返回api的输出,但是不起作用。

 app.UseWindowsAzureActiveDirectoryBearerAuthentication(
                new WindowsAzureActiveDirectoryBearerAuthenticationOptions
                {
                    Audience = ConfigurationManager.AppSettings["ida:Audience"],
                    Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                    TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
                    {
                        ValidateIssuer = false
                    }
                });

有什么帮助吗?

1 个答案:

答案 0 :(得分:3)

API不应要求用户登录。 Bearer令牌认证的第二个选项是正确的。这意味着您的客户端应用需要获取访问令牌,并将其与HTTP请求一起传递。

AcquireTokenAsyncAcquireTokenSilentAsync的工作方式与您的想法有些不同。 第一个使用一些参数,然后调用AAD授权的/ oauth2 / token端点以获取访问令牌,除非它已在缓存中包含访问令牌。 静默版本仅检查缓存,如果找不到缓存则抛出异常。

因此,您的客户端应用通常会使用AcquireTokenAsync变体之一来获取访问令牌和刷新令牌。 当您这样做时,ADAL会将令牌存储在您赋予它的令牌缓存中(或默认情况下是内存中的缓存)。 然后,在以后的代码中,您可以使用静默版本来获取令牌,因为您可以期望它们位于缓存中。