情境: Web应用程序和Web API都需要在服务器端进行身份验证和保护。
要求: Web应用程序正在为浏览器提供内容,浏览器应该直接调用Web API(即Browser to API)。
问题: 是否可以使用令牌验证Web APP和API?
任何示例代码或明确的方向都将受到高度赞赏。
通常使用cookie对Web应用程序进行身份验证,并使用令牌对API进行身份验证。有一些示例项目可用here但它们是浏览器到API(基于SPA令牌)或服务器端Web App调用API从服务器到服务器。
更新1
应用程序正在保存TokenValidationParameters
并在app控制器中使用bootstrapContext.Token
来抓取服务器到服务器的通信。
根据@dstrockis,我试图在验证结束后不久从Web应用程序中获取id_token
(不在app控制器内)。
我在SecurityTokenValidated
课程的OpenIdConnectAuthenticationOptions.Notifications
中使用Startup
调用者。 SecurityTokenValidated
收到SecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions>
类型的参数,但我不确定在其中找到id_token
的位置。方法如下。
private OpenIdConnectAuthenticationOptions CreateOptionsFromPolicy(string policy)
{
return new OpenIdConnectAuthenticationOptions
{
// For each policy, give OWIN the policy-specific metadata address, and
// set the authentication type to the id of the policy
MetadataAddress = String.Format(aadInstance, tenant, policy),
AuthenticationType = policy,
// These are standard OpenID Connect parameters, with values pulled from web.config
ClientId = clientId,
RedirectUri = redirectUri,
PostLogoutRedirectUri = redirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications
{
AuthenticationFailed = OnAuthenticationFailed,
//NEW METHOD INVOKE ************************************
//******************************************************
SecurityTokenValidated = OnSecurityTokenValidated
//******************************************************
},
Scope = "openid",
ResponseType = "id_token",
TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
SaveSigninToken = true
},
};
}
//NEW METHOD ************************************
private Task OnSecurityTokenValidated(
SecurityTokenValidatedNotification<OpenIdConnectMessage,
OpenIdConnectAuthenticationOptions> arg)
{
//QUESTION ********************************************************
//How to find the just saved id_token using incoming parameter, arg
//*****************************************************************
return Task.FromResult(0);
}
更新2
而不是SecurityTokenValidated
,我尝试了AuthorizationCodeReceived
并且根本没有被调用。正如这里所讨论的,我的redirect url does have an ending slash也是如此。
任何想法?
答案 0 :(得分:2)
我们支持AAD B2C的ASP.NET OpenID Connect中间件是依赖于浏览器的cookie身份验证而构建的。它不接受标题中的标记或类似的用于保护网页的标记。所以我想说如果你想以经典方式从你的网络应用程序提供HTML,你需要使用cookie来验证对网络应用程序的请求。
你绝对可以得到&amp;即使您使用Cookie对Web应用程序进行身份验证,也会在浏览器中存储令牌并使用这些令牌访问您的Web API。我推荐两种模式:
id_token
并在浏览器中删除cookie以供将来请求使用。您可以使用编写的代码行here指示中间件保存id_token
以供以后使用。然后,您可以以某种方式将id_token
传递给浏览器,对其进行缓存,并使用它向API发出请求。id_token
向您的Web应用发送请求,触发OpenID Connect中间件来处理请求并发出会话cookie。如果您想知道该请求的格式,我建议您检查常规服务器端OpenID Connect流。 答案 1 :(得分:0)
找到我自己的问题的答案,并在此添加以供将来参考。
验证成功后,可以通过调用id_token
通知来访问SecurityTokenValidated
。代码示例如下。
private Task OnSecurityTokenValidated(
SecurityTokenValidatedNotification<OpenIdConnectMessage,
OpenIdConnectAuthenticationOptions> arg)
{
//Id Token can be retrieved as below.
//**************************************
var token = arg.ProtocolMessage.IdToken;
return Task.FromResult(0);
}
但是,将其直接保存到浏览器cookie中可能并不安全。