目前,我们的ASP.NET MVC系统使用OpenIdConnect和cookie身份验证进行保护。我们使用azure活动目录启用了oauth身份验证流程。
public void ConfigureAuthOpenIdConnect(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
var cookieAuthenticationOptions = new CookieAuthenticationOptions()
{
//...
};
app.UseCookieAuthentication(cookieAuthenticationOptions);
var notifications = new OAOpenIdConnectAuthenticationNotifications();
var openIdConnectAuthenticationOptions = new OpenIdConnectAuthenticationOptions()
{
//...
Notifications = notifications
};
app.UseOpenIdConnectAuthentication(openIdConnectAuthenticationOptions);
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigHelper.ClientSettings.TenantName,
TokenValidationParameters = new TokenValidationParameters
{
ValidAudience = ConfigHelper.ClientSettings.ClientId
}
});
}
现在,当我们通过OpenIdConnect进行身份验证时,我们使用Notifications
选项上的自定义OpenIdConnectAuthenticationOptions
检索授权代码,这使我们能够使用ADAL请求和缓存资源令牌。
当尝试使用azure AD承载令牌访问我们的系统时会出现问题,此获取和缓存资源令牌的工作流程不存在。
所以我的问题是,如何使用持票令牌启用此功能?如何使用OpenIdConnect请求其他资源令牌?是否可以使用ADAL从持有人令牌中获取授权码?
答案 0 :(得分:3)
正如您所提到的,您正在使用OpenID Connect ASP.NET中间件和ADAL .NET来使用Azure AD进行登录,然后在OnAuthorizationCodeReceived
OpenID Connect通知中以登录用户的身份调用Web API
在这种情况下,您可以使用授权代码将其交换为特定资源的访问令牌。
另一方面,当客户端应用程序使用azure AD承载令牌访问您的系统时,没有授权代码。在这种情况下,如果要使用该访问令牌将其交换到另一个资源的访问令牌(如Microsoft Graph),则可以使用OAuth 2.0 On-Behalf-Of flow。 OAuth 2.0 On-Behalf-Of流程服务于应用程序调用服务/ Web API的用例,而后者又需要调用另一个服务/ Web API。
有关协议如何在此方案中工作的详细信息,请参阅Authentication Scenarios for Azure AD和On-Behalf-Of flow tutorial。 当然,您可以使用ADAL.NET执行On-Behalf-Of流程,请参阅this code sample。