几天来一直在敲我的脑袋。
所以我将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?任何有关这方面的指导都将非常感激。
答案 0 :(得分:1)
Startup.cs
配置是客户端的启动,但您尝试在api资源中使用它。
api资源的启动应该看起来像那个here(我正在展示Identity Server 3的启动,因为我知道你的API是.Net Framework的一个)。这就是永远不会达到代码的原因(您在评论中提到的内容)。
老实说,我很确定,你无法实现你的目标 - 在api资源中为令牌添加自定义声明。 api资源被使用,并阅读已经提供的声明(大多数时候api的授权是根据声明完成的。)
否则,你所做的所有其他事情都是正确的。您应该使用IdentityServer3.AccessTokenValidation
用于.Net Framework客户端和api(没有问题,令牌发行者是IDS4)。
很可能这就是你收到401的原因。你没有正确设置api的权限。我希望这有助于