【问题标题】:Configure JWT Access Token in .NET core 2 MVC application在 .NET core 2 MVC 应用程序中配置 JWT 访问令牌
【发布时间】:2019-04-06 03:54:43
【问题描述】:

我在控制台应用程序中成功地从 Azure Active Directory 检索了授权令牌。我想将此代码转换为 .Net Core MVC,但不确定如何在 Startup.cs 中干净地配置所有内容

我假设键/值对将被移动到 appsettings.json,但我如何在ConfigureServices() 下获取此令牌?

    var client = new HttpClient();

    var uri = "https://login.microsoftonline.com/<tenantid>/oauth2/token";

    var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("resource", "{resourceID}"),
        new KeyValuePair<string, string>("client_id", "{clientID}"),
        new KeyValuePair<string, string>("client_secret", "{clientSecret}"),
        new KeyValuePair<string, string>("grant_type", "client_credentials"),
        new KeyValuePair<string, string>("scope", "openid")
     };

    var content = new FormUrlEncodedContent(pairs);
    var response = client.PostAsync(uri, content).Result;

    string result = string.Empty;

    if (response.IsSuccessStatusCode)
    {
        result = response.Content.ReadAsStringAsync().Result;
        JObject jObject = JObject.Parse(result);
        string token = (string)jObject.SelectToken("access_token");
    }

我应该使用以下方法之一来获取不记名令牌吗?我正在控制台应用程序中进行 POST,但这似乎不适用于启动配置。

services.AddAuthentication() 

.AddJwtBearer()

【问题讨论】:

  • 您正在编写 Web 应用程序吗?还是 Web API?如果您正在编写 Web 应用程序,我建议您查看以下示例:active-directory-aspnetcore-webapp-openidconnect-v2。它有 2 个部分: - 将用户登录到 Web 应用程序 - 为登录用户获取令牌以调用 API:在名为 [signInAndCallMsGraph ](github.com/Azure-Samples/…) 的分支中
  • 另外,我不建议您像您一样获取访问令牌,尤其是您正在使用客户端凭据授予,这意味着有一个秘密(除非此控制台应用程序在具有非常受控访问)。 Auth 库将帮助您对所有类型的 scenarios 执行此操作,例如 MSAL.NET。看来你想做的是Acquiring a token for the app
  • 好的,感谢您提供的示例,我让它运行并进行身份验证,但它不提供身份验证令牌。我正在尝试调用我在 Azure 中作为应用服务开发的现有 API
  • 我正在查看 Jean-Marc 的其他示例流程,我会回复你@JoeyCai

标签: c# azure asp.net-core azure-active-directory azure-web-app-service


【解决方案1】:

我让它运行并进行身份验证,但它不提供身份验证令牌。

正如 Jean 所说,您可以使用 Microsoft Authentication Library (MSAL),该库可帮助您开发与 v2.0 端点一起使用的应用程序,在这里您可以使用它来获取访问令牌。

这里的范围是你要附加.default的资源。参考这个article

在这个请求中传递给scope参数的值应该是你想要的资源的资源标识符(Application ID URI),加上.default后缀。对于 Microsoft Graph 示例,该值为 https://graph.microsoft.com/.default。该值通知 v2.0 端点,在您为应用配置的所有直接应用权限中,它应该为与您要使用的资源关联的权限颁发令牌。

以下是C# MSAL示例代码,获取该应用权限场景的访问令牌。您需要在项目中安装NuGet包Microsoft.Identity.Client

ConfidentialClientApplication app = new ConfidentialClientApplication("clientId",
    "https://login.microsoftonline.com/tenantId/v2.0",
    "redirectUrl",
    new ClientCredential("clientSecret"),
    new TokenCache(),null);
AuthenticationResult authResult = app.AcquireTokenForClientAsync(
    new string[] { "https://graph.microsoft.com/.default"}).Result;
var token = authResult.AccessToken;

这里你可以将Microsoft Graph API更改为你的APIApplication ID URI,关于添加权限等的更多细节,你可以参考这个article

【讨论】:

  • 示例代码有效,我从图形 API 获得令牌和响应。但是,当我将图形 URL 更改为我新创建的范围 (api://xxxxxx-xxxxx-xxxxxx-xxxx/testscope) 时,我收到错误“输入参数‘范围’的提供值无效。范围。 /default 有效,但当我尝试调用我的 API 端点时它返回 401
  • 根据这篇文章,v2 端点不能用于调用另一个目录上的 API,例如我的场景。 zure.com/blog/…
  • 您是否为您的 API 添加了权限?或者你介意像one这样改变流程吗?
【解决方案2】:

您可以改用 OWIN 启动类。请参阅 Microsoft 的此示例

https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v1-aspnet-webapp

【讨论】:

  • 我正在使用守护程序应用程序,所以我不能有登录屏幕
猜你喜欢
  • 2023-03-16
  • 2019-05-11
  • 2019-08-02
  • 2019-01-21
  • 2018-10-14
  • 1970-01-01
  • 2020-08-12
  • 2022-11-09
  • 1970-01-01
相关资源
最近更新 更多