使用Azure AD B2C对Web App和Web API进行基于令牌的身份验证

时间:2017-03-16 10:10:45

标签: authentication asp.net-mvc-5 asp.net-web-api2 azure-ad-b2c http-token-authentication

情境: 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也是如此。

任何想法?

2 个答案:

答案 0 :(得分:2)

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

你绝对可以得到&amp;即使您使用Cookie对Web应用程序进行身份验证,也会在浏览器中存储令牌并使用这些令牌访问您的Web API。我推荐两种模式:

  • 使用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流。

答案 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中可能并不安全。