如何将身份从 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 层应用程序中的用户身份从用户界面层传递到数据访问层?
具有混合身份验证 JWT 和 SAML 的 ASP.NET Web API 2.2 OWIN