c# - 使用 IdentityServer4 添加自定义 API 访问声明

标签 c# asp.net-core asp.net-identity openid-connect identityserver4

我正在尝试使用一个应用程序来使用 IdentityServer4,它具有身份服务器、MVC 客户端和 Web API 的基本设置。

我有一个自定义配置文件服务(我已在 Startup.cs 中注册),我在其中添加自定义声明,这是我的 GetProfileDataAsync 方法:

public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
    var user = _userManager.GetUserAsync(context.Subject).Result;

    var claims = new List<Claim>
    {
        new Claim("TestFullName", user.FullName),
    };

    context.IssuedClaims.AddRange(claims);          

    return Task.FromResult(0);
}

我的问题是,当我登录身份服务器时,我可以看到附加声明 - 但是当我从 MVC 应用程序调用我的 API 时,我的自定义声明不存在。以下是我的 MVC 应用程序中用于调用 API 的代码:

public async Task<IActionResult> ClientAuthorizedAPICall(string token)
{
    // discover endpoints from metadata
    var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

    // request token
    var tokenClient = new TokenClient(disco.TokenEndpoint, "client", "secret");
    var tokenResponse = await tokenClient.RequestClientCredentialsAsync("testAPI");        

    // call api
    var client = new HttpClient();
    client.SetBearerToken(tokenResponse.AccessToken);

    var response = await client.GetAsync("http://localhost:5001/identity");
    ...
} 

我的 API 上的方法很简单:

[HttpGet]
public IActionResult Get()
{
    return new JsonResult(from c in User.Claims select new { c.Type, c.Value });           
}

我做错了什么吗?或者我应该做一些不同的事情而不是使用User.Claims

最佳答案

就像 rawel 的评论所说,您将需要使用 MVC 应用程序用户的访问 token 来进行 API 调用。它看起来像这样:

// get the current user's access token
var accessToken = await HttpContext.GetTokenAsync("access_token");

// call api
var client = new HttpClient();
client.SetBearerToken(accessToken);

var response = await client.GetAsync("http://localhost:5001/identity");

您可以在quickstart on hybrid flow中看到类似的方法。 .

要将自定义用户声明放入 API 的访问 token 中,您需要在定义 API 资源时将其包含在内。例如:

new ApiResource("testAPI", "Test API", new[] { "TestFullName" }),

关于c# - 使用 IdentityServer4 添加自定义 API 访问声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46457470/

相关文章:

asp.net-mvc-5 - 如何使用 Asp.net Identity MVC5 Web 应用程序跟踪用户登录

c# - 在 OWIN TestServer 上调用 HTTP PUT

c# - .NET Core + MSBuild : How to associate a csproj with multiple project. json 文件?

c# - WebAPI 中的 EFCore 3.1 应返回什么类型的集合?

c# - 如何根据单个 ASP.NET Core 应用程序中的某些内容动态更改 OpenID 配置?

使用 ASP.NET Identity 进行数据库设计

c# - 在 ASP.NET Identity 2 中通过 UserManager.Update() 更新用户

c# - 在 C# 中将字符串值格式化为 $xx.xx 格式

c# - 具有错误报告和依赖项集成的 SmartAssembly 的免费替代品

c# - 如何读取或写入数百万个目录?