我有已在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
}
});
有什么帮助吗?
答案 0 :(得分:3)
API不应要求用户登录。 Bearer令牌认证的第二个选项是正确的。这意味着您的客户端应用需要获取访问令牌,并将其与HTTP请求一起传递。
AcquireTokenAsync
和AcquireTokenSilentAsync
的工作方式与您的想法有些不同。
第一个使用一些参数,然后调用AAD授权的/ oauth2 / token端点以获取访问令牌,除非它已在缓存中包含访问令牌。
静默版本仅检查缓存,如果找不到缓存则抛出异常。
因此,您的客户端应用通常会使用AcquireTokenAsync
变体之一来获取访问令牌和刷新令牌。
当您这样做时,ADAL会将令牌存储在您赋予它的令牌缓存中(或默认情况下是内存中的缓存)。
然后,在以后的代码中,您可以使用静默版本来获取令牌,因为您可以期望它们位于缓存中。