如何将身份从 Web 应用程序委托给 WebAPI

Posted

技术标签:

【中文标题】如何将身份从 Web 应用程序委托给 WebAPI【英文标题】:How to delegate Identity from Web-Application to WebAPI 【发布时间】:2016-05-19 14:57:57 【问题描述】:

我正在尝试构建一个网站,用户在该网站上登录并可以使用后端 web-API。

对后端 web-API 的调用将始终由前端网站代理,因为后端不公开。 后端和前端是基于 ASP.net Core 的 MVC 6(或 MVC Core?)项目。

前端当前使用 OpenId-Connect 进行身份验证(成功)。 后端应该使用 JwtBearerToken。

到目前为止的身份验证请求响应类型为id_token code,范围为openid profile

在往返于 Auth-Server (ADFS 2016) 之后,我将在来自 ASP.NET 的 AuthorizationCodeReceived-Event 中结束,但我无法将代码交换为授权令牌。我使用 ADAL 尝试了以下操作:

public override async Task AuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
        
            await base.AuthorizationCodeReceived(context);

            var clientCredential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret);

            var oAuthContext = new AuthenticationContext(context.Options.Authority, false);
            var oAuthResult = await oAuthContext.AcquireTokenByAuthorizationCodeAsync(context.Code, new Uri(context.RedirectUri), clientCredential);
        

我不得不禁用权限验证(我不喜欢),除了 Http-Status 400 之外,我没有得到其他结果。 对于如何继续前进,我很乐意提供任何建议。

更新 进一步调查显示,OpenIdConnect-Configuration 允许将身份验证和刷新令牌保存到声明中。不过,我首先看不到转换它的可能性。 我也尝试过手动交换代码(PS:Invoke-WebRequest ...)但没有成功。或许这是ADFS TP4的问题……

【问题讨论】:

从 ASP.Net Core RC2 开始,这会自动运行。 【参考方案1】:

我已经设法让这个场景与 TP4 一起工作。

AuthorizationCodeReceived = async n =>

   string code = n.Code;

   AuthenticationContext ac = new AuthenticationContext(BaseAddress, false);
   ClientCredential client = new ClientCredential("clientid", "secret");
   string resourceId = "https://myservices/myapi";
   AuthenticationResult ar = await ac.AcquireTokenByAuthorizationCodeAsync(code, new Uri("https://localhost:44300/"), client, resourceId);

然后您可以使用控制器方法中的访问令牌,如下所示:

AuthenticationContext ac = new AuthenticationContext(Startup.BaseAddress, false);
ClientCredential cred = new ClientCredential("clientid", "secret");
string resourceId = "https://myservices/myapi";
AuthenticationResult ar = ac.AcquireTokenSilent(resourceId, cred, UserIdentifier.AnyUser);


var client = new HttpClient();
client.SetBearerToken(ar.AccessToken);

var result = await client.GetStringAsync("http://localhost:2727/identity");

【讨论】:

嗯..看起来很眼熟-您可以添加信息吗,这里的BaseAddress是什么? 从 RC2 开始,来自 Asp.Net Core 的 OpenIdConnect 将自动执行此操作

以上是关于如何将身份从 Web 应用程序委托给 WebAPI的主要内容,如果未能解决你的问题,请参考以下文章

如何将用于审计目的的 web n 层应用程序中的用户身份从用户界面层传递到数据访问层?

如何使用基于 cookie 的身份验证授权 Web API

具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN

在仅从其他应用程序接收数据的 Web API 中使用啥类型的身份验证

如何设计出优美的Web API?

HttpClient 将 ClaimsIdentity 传递给另一个 WebApi