如何将Web应用程序中的标识委派给WebAPI

时间:2016-02-09 14:57:33

标签: asp.net-core asp.net-core-mvc jwt openid-connect bearer-token

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

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

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

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

在到Auth-Server(ADFS 2016)的往返之后,我将最终进入来自ASP.NET的AuthorizationCodeReceived - 事件,但我没有交换授权令牌代码的运气。我使用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的问题......

1 个答案:

答案 0 :(得分: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");