gpt4 book ai didi

identityserver4 - Identity Server 4 上授权客户端的自定义端点

转载 作者:行者123 更新时间:2023-12-01 11:19:04 25 4
gpt4 key购买 nike

我希望我的 Identity Server 4 服务器为一些已注册的客户端提供附加服务(例如, "MyAdditionalService" )。他们将通过在服务器上定义的自定义端点使用该服务。

我正在考虑为我的服务定义一个 API(例如,名为“myAdditionalService”),以便可以根据客户端的配置授予对此类服务的访问权限。但是,我不确定如何限制对端点(MVC - 操作方法)的访问,只允许允许使用 API 的客户端(可能代表用户)。

我发现我可以这样做:

services.AddAuthorization(options =>
{
options.AddPolicy("MyAdditionalServicePolicy",
policy => policy.RequireClaim("scope",
"myAdditionalService"));
});

并使用属性 [Authorize("MyAdditionalServicePolicy")]装饰用于访问此类服务的操作方法。但是,我不知道服务器是否可以同时成为 API,甚至是否可能。

我该如何实现?令人困惑的是 token 服务也扮演 API 的角色,因为它保护对操作方法或端点的访问。

谢谢。

更新:

我的网络应用程序是一个 IdentityServerWithAspNetIdentity,它已经使用了 Asp.net 核心身份的身份验证机制。举个例子,我的网络应用程序如果提供给一些注册客户的附加服务是用户的 Twitter 好友列表(以名为 Twitter 的 Controller 为模型,名为 ImportFriends 的操作)该 API 因此称为“TwitterFriends”

根据下面回复的建议,我修改了我的 Configure()方法 app.UseJwtBearerAuthentication() .我已经有了 app.UseIdentity()app.UseIdentityServer()如下所示:
        app.UseIdentity();
app.UseIdentityServer();


app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AuthenticationScheme = "Bearer",
Authority = Configuration["BaseUrl"],
Audience = "TwitterFriends",
RequireHttpsMetadata = false //TODO: make true, it is false for development only
});

// Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715
app.UseGoogleAuthentication(new GoogleOptions
{
AuthenticationScheme = "Google",
SignInScheme = "Identity.External", // this is the name of the cookie middleware registered by UseIdentity()

在专用 Controller 上:
 [Authorize(ActiveAuthenticationSchemes = "Identity.Application,Bearer")]
//[Authorize(ActiveAuthenticationSchemes = "Identity.Application")]
//[Authorize(ActiveAuthenticationSchemes = "Bearer")]
[SecurityHeaders]
public class TwitterController : Controller
{...

但我在日志中得到了这个:
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware
[7]
Identity.Application was not authenticated. Failure message: Unprotect tic
ket failed
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed for user: (null).
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.A
uthorization.AuthorizeFilter'.
info: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
Executing ChallengeResult with authentication schemes (Identity.Applicatio
n, Bearer).
info: Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware
[12]
AuthenticationScheme: Identity.Application was challenged.
info: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[12]
AuthenticationScheme: Bearer was challenged.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action IdentityServerWithAspNetIdentity.Controllers.TwitterContro
ller.ImportFriends (IdentityServerWithAspNetIdentity) in 86.255ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 105.2844ms 401

我已经尝试了不同的属性组合,但在这种情况下,Identity.Application 和 Bearer 似乎无法相处:获得 401。

任何帮助表示赞赏。
谢谢..

最佳答案

请参阅此示例了解如何在与 IdentityServer 相同的 Web 应用程序中托管 API。

https://github.com/brockallen/IdentityServerAndApi

本质上,您需要添加 JWT token 验证处理程序:

services.AddAuthentication()
.AddJwtBearer(jwt =>
{
jwt.Authority = "base_address_of_identityserver";
jwt.Audience = "name of api";
});

在 API 本身上,您必须选择 JWT 身份验证方案:

public class TestController : ControllerBase
{
[Route("test")]
[Authorize(AuthenticationSchemes = "Bearer")]
public IActionResult Get()
{
var claims = User.Claims.Select(c => new { c.Type, c.Value }).ToArray();
return Ok(new { message = "Hello API", claims });
}
}

如果您想强制执行额外的授权策略,您可以将其传递到 [Authorize] 属性中或强制调用它。

关于identityserver4 - Identity Server 4 上授权客户端的自定义端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com