【问题标题】:Non-interactive user authentication using AAD v2使用 AAD v2 的非交互式用户身份验证
【发布时间】:2018-02-04 07:16:11
【问题描述】:

我们正在公开一个用 ASP .net Core Web API 编写的服务,并使用 AAD V2 和基于声明的身份验证。 我们的客户使用 V2 支持的 Microsoft 和 MSA 帐户。

我们有一个要求,消费者需要从 Windows 服务中使用我们的 Web API。(非交互式) 我们了解 AAD V2 不支持资源所有者密码凭据。

我们尝试使用客户端密码方法,但我们无法从这种方法中区分特定用户,因为我们没有获得 UPN 或唯一值。 您能否告诉我们是否有其他方法可以在这种情况下使用。

【问题讨论】:

    标签: azure asp.net-web-api azure-active-directory


    【解决方案1】:

    嗯,

    如果您需要从 Windows 服务进行身份验证,这会自动消除授权代码和 ROPC 流。仅仅是因为您没有用户上下文。这就是为什么您也不需要 ID 令牌。在这种情况下,您只需要一个访问令牌。有一个interesting reading on the Auth0 blogs here

    话虽如此,我建议您为 每个 将使用您的 WebAPI 的 Windows 服务客户端创建一个单独的应用程序注册。您还可以为开发人员门户中的每个应用程序自动“授予”对 Web API 的访问权限。

    同时,您需要为用户交互流程保留单个“Web 应用”应用程序注册。仍然作为授予 Web API 的单独应用程序注册。

    再一次 - 重新考虑仅使用 访问令牌 来访问您的 Web API。

    关闭 - 我不确定 v.2.0 是否完全支持客户端凭据流,但这绝对是可行的方法。

    【讨论】:

    【解决方案2】:

    您可以静默获取用户令牌。您可以使用 MSAL 缓存并静默获取令牌。

    这是一个例子:

    您可以在此处再次使用 MSAL 从 MSAL 缓存中获取 access_tokens。首先,将 MSAL 的 using 语句添加到此文件中。

    using Microsoft.Identity.Client;
    

    在 Index 操作中,使用 MSAL 的 AcquireTokenSilentAsync 方法获取可用于从 To-Do List 服务读取数据的 access_token:

    // ...
    string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").Value;
    string tenantID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
    string authority = String.Format(CultureInfo.InvariantCulture, Startup.aadInstance, tenantID, string.Empty);
    ClientCredential credential = new ClientCredential(Startup.clientId, Startup.clientSecret);
    
    // Here you ask for a token using the web app's clientId as the scope, since the web app and service share the same clientId.
    app = new ConfidentialClientApplication(Startup.clientId, redirectUri, credential, new NaiveSessionCache(userObjectID, this.HttpContext)){};
    result = await app.AcquireTokenSilentAsync(new string[] { Startup.clientId });
    // ...
    

    这里是 .Net App 的 the source document。但它的方法也应该适用于 .Net Core App。

    【讨论】:

    • 在我的问题中告知这种方法不起作用,API 需要知道哪个用户调用了 API,在给出的示例代码中创建的访问令牌中缺少 UPN。我想区分调用者。
    • 嗨,@arunmudiraj。如果真的想获取用户的upn等信息。您可能需要获取Id_token。客户端凭据授予流程无法实现这一点。所以你可以使用 OAuth 2.0 授权码流。您将在此流程中获得Id_token,并且id_token 包含preferred_usernameemail 声明。但它使用刷新令牌来获取令牌。
    • 客户端凭据流需要显示交互式 UI,这是不可行的,我们正在寻找类似于 blogs.msdn.microsoft.com/wushuai/2016/09/25/… 的东西
    • 给定的方法是针对 AAD v1 而不是 AAD v2
    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多