2

场景: Web 应用程序和 Web API 都需要从服务器端进行身份验证和保护。

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

问题: 是否可以同时使用令牌对 Web APP 和 API 进行身份验证?

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


通常,Web 应用程序使用 cookie 进行身份验证,API 使用令牌进行身份验证。这里有一些示例项目,但它们是浏览器到 API(基于 SPA 令牌)或服务器端 Web 应用程序从服务器到服务器调用 API。

更新 1

应用程序正在保存TokenValidationParametersbootstrapContext.Token在应用程序控制器中使用以获取服务器到服务器的通信。

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

我在课堂上使用SecurityTokenValidated调用者。接收一个类型的参数,但我不知道在哪里可以找到它。方法如下。OpenIdConnectAuthenticationOptions.NotificationsStartupSecurityTokenValidatedSecurityTokenValidatedNotification<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,它根本没有被调用。正如这里所讨论的,我的重定向 url 也有一个结尾斜杠

有任何想法吗?

4

2 回答 2

2

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

您绝对可以在浏览器中获取和存储令牌并使用这些令牌访问您的 Web API,即使您使用 cookie 对 Web 应用程序进行身份验证也是如此。我推荐两种模式:

  • 使用 OpenID Connect 中间件执行初始登录,从服务器端启动流程,如示例中所述。流程完成后,中间件将验证结果id_token并将 cookie 放入浏览器中以供将来请求。您可以使用此处编写的代码行指示中间件保存以id_token供以后使用。然后,您可以以某种方式将其传递给您的浏览器,缓存它,并使用它向 API 发出请求。id_token
  • 另一种模式是相反的。首先使用 B2C 文档中的单页应用程序模式从 javascript 启动登录。在浏览器中缓存生成的 id_tokens,并使用它们进行 API 调用。但是当登录完成时,您可以向您的 Web 应用程序发送一个请求,并id_token在正文中触发 OpenID Connect 中间件来处理请求并发出会话 cookie。如果您想知道该请求的格式,我建议您检查常规的服务器端 OpenID Connect 流程。
于 2017-03-17T20:13:40.880 回答
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 中可能并不安全。

于 2017-03-20T22:03:12.353 回答