1

场景: Web应用程序和Web API都需要从服务器端进行身份验证和保护。使用Azure AD对Web应用程序和Web API进行基于令牌的身份验证B2C

要求: Web应用程序正在为浏览器提供内容,浏览器应直接调用Web API(即Browser to API)。

问题: 是否可以使用标记验证Web应用程序和API?

任何示例代码或清晰的方向将不胜感激。


通常Web应用程序使用cookie认证和API使用tokens.There认证可here一些样本项目,但他们要么是浏览器API(SPA基于令牌)或服务器端Web应用程序调用从服务器的API服务器。

UPDATE 1

应用被保存TokenValidationParameters和该应用控制器内使用bootstrapContext.Token抓住服务器到服务器的通信。

根据@dstrockis,我试图在验证结束后不久(在应用程序控制器内)从Web App抓取id_token

我在Startup类中使用SecurityTokenValidated调用者OpenIdConnectAuthenticationOptions.NotificationsSecurityTokenValidated收到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也是如此。

任何想法?

回答

1

我们的ASP.NET OpenID Connect中间件支持AAD B2C,它的构建依赖于来自浏览器的cookie认证。它不接受令牌或类似的东西来保护网页。所以我想说,如果你想以经典的方式从你的web应用程序提供HTML,你需要使用cookie来验证对web应用程序的请求。

在浏览器中,您绝对可以获得&商店标记,并使用这些标记访问您的Web API,即使您使用Cookie对Web应用进行身份验证。我推荐两种模式:

  • 使用OpenID Connect Middleware执行初始登录,按照示例中所述从服务器端启动流程。流程完成后,中间件将验证生成的id_token并在浏览器中删除Cookie以备将来使用。您可以通过使用编写的代码行here来指示中间件保存id_token供以后使用。然后,您可以以某种方式将id_token传递给您的浏览器,对其进行缓存,然后使用它向API发出请求。
  • 其他模式是逆。首先使用来自B2C文档的单页应用程序模式启动来自JavaScript的登录。在浏览器中缓存生成的id_tokens,并使用它们进行API调用。但是,当登录完成时,您可以将正文中id_token的请求发送到您的Web应用程序,从而触发OpenID Connect中间件处理请求并发出会话Cookie。如果你想知道这个请求的格式,我建议检查一个普通的服务器端OpenID Connect流。
0

找到了我自己的问题的答案,并在这里添加为未来的参考。

验证成功后,可以通过调用SecurityTokenValidated通知来访问id_token。代码示例如下。

private Task OnSecurityTokenValidated(
     SecurityTokenValidatedNotification<OpenIdConnectMessage, 
         OpenIdConnectAuthenticationOptions> arg) 
{ 
    //Id Token can be retrieved as below. 
    //************************************** 
    var token = arg.ProtocolMessage.IdToken; 

    return Task.FromResult(0); 
} 

但是,直接将其保存到浏览器cookie中可能不安全。

+0

你能解释一下多一点吗?此方法何时执行?你如何实施解决方案? – zuckerthoben

+0

所有这些都在Web应用程序(而不是API)的App_Start目录中的Startup.Auth.cs的Startup类中完成。您需要首先对Web App和API进行身份验证。原始帖子中有一个链接,用于示例项目。 – Kaf

相关问题