使用oidc对SPA,WEBAPI和Identity Server 4进行自定义声明?

时间:2018-04-25 22:13:15

标签: c# oauth-2.0 identityserver4 oidc

几天来一直在敲我的脑袋。

所以我将Identity Server 4作为我的“身份验证即服务”集中登录所有应用程序,使用ASP.NET Identity进行用户管理。

在我的客户端,我使用Angular和oidc-client.js,到目前为止一切正常,我可以获得用户身份令牌和访问令牌。

对于我的WebApi(不使用.NET Core),我正在尝试使用UseOpenIdConnectAuthentication,因此我可以通过OpenIdConnectAuthenticationNotifications添加特定于应用的自定义声明,但在调用我的时候会收到401 Unauthorized来自Angular的API。

app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
     ResponseType = "id_token token",
     Scope = "openid profile api1",
     Authority = "http://localhost:61294/",
     ClientId = "api",
     RedirectUri = "http://localhost:56105/sigin-oidc",
     Notifications = new OpenIdConnectAuthenticationNotifications
     {
         AuthorizationCodeReceived = async n =>
         {
             // Ignore, just testing 
             var tokenClient = new TokenClient("http://localhost:61294/connect/token", "mvc");
             var tokenResponse = await tokenClient.RequestAuthorizationCodeAsync(n.Code, n.RedirectUri);
         },
         SecurityTokenValidated = async n =>
         {
             var userInfoClient = new UserInfoClient(new Uri("http://localhost:61294/connect/userinfo"), n.ProtocolMessage.AccessToken);
             var userInfo = await userInfoClient.GetAsync();

             var nId = new ClaimsIdentity(
                               n.AuthenticationTicket.Identity.AuthenticationType,
                               ClaimTypes.GivenName,
                               ClaimTypes.Role);

             userInfo.Claims.ToList().ForEach(c => nId.AddClaim(new Claim(c.Item1, c.Item2)));

             nId.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

             nId.AddClaim(new Claim("Test", "test"));

             n.AuthenticationTicket = new AuthenticationTicket(nId, n.AuthenticationTicket.Properties);
             n.Request.Headers.SetValues("Authorization ", "Bearer ", n.ProtocolMessage.AccessToken);
         },
         SecurityTokenReceived = async n =>
         {
             Debug.WriteLine(n);
         }
     }
 });

我还使用了包IdentityServer3.AccessTokenValidation并使用了app.UseIdentityServerBearerTokenAuthentication,它工作正常,我能够成功调用我的API,但我不知道如何通过此方式应用我的自定义声明。< / p>

我是否以错误的方式使用app.UseOpenIdConnectAuthentication进行网络API?任何有关这方面的指导都将非常感激。

1 个答案:

答案 0 :(得分:1)

好的,现在我得到了你的问题。您发布的Startup.cs配置是客户端的启动,但您尝试在api资源中使用它。

api资源的启动应该看起来像那个here(我正在展示Identity Server 3的启动,因为我知道你的API是.Net Framework的一个)。这就是永远不会达到代码的原因(您在评论中提到的内容)。

老实说,我很确定,你无法实现你的目标 - 在api资源中为令牌添加自定义声明。 api资源被使用,并阅读已经提供的声明(大多数时候api的授权是根据声明完成的。)

否则,你所做的所有其他事情都是正确的。您应该使用IdentityServer3.AccessTokenValidation用于.Net Framework客户端和api(没有问题,令牌发行者是IDS4)。

很可能这就是你收到401的原因。你没有正确设置api的权限。我希望这有助于