• 使用Hybrid Flow并添加API访问控制


    关于Hybrid Flow 和 implicit flow

    Hybrid Flow 和 implicit flow是OIDC(OpenID Connect)协议中的术语,Implicit Flow是指使用OAuth2的Implicit流程获取Id Token和Access Token;Hybrid Flow是指混合Authorization Code Flow(OAuth授权码流程)和Implici Flow。

    在之前的文章,我们探索了API访问控制和身份认证。 现在我们要把这两个部分结合在一起。

    OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单一协议和令牌服务进行单一交换。

    在前一篇文章中,我们使用了OpenID Connect implicit flow。 在implicit流程中,所有的令牌都通过浏览器传输,这对于身份令牌来说是完全不错的。 现在我们也想要一个访问令牌。访问令牌比身份令牌更加敏感,如果不需要,我们不想让它们暴露于“外部”世界。 OpenID Connect包含一个名为“混合流”的流程,它可以让我们两全其美,身份令牌通过浏览器通道传输,因此客户端可以在做更多的工作之前验证它。 如果验证成功,客户端会打开令牌服务的后端通道来检索访问令牌。

    修改客户端配置

    没有必要做太多的修改。 首先,我们希望允许客户端使用混合流,另外我们还希望客户端允许服务器到服务器API调用,这些调用不在用户的上下文中(这与我们的客户端证书quickstart非常相似)。 这是使用AllowedGrantTypes属性表示的。

    接下来我们需要添加一个客户机密钥。 这将用于反向检索通道上的访问令牌。

    最后,我们还让客户端访问offline_access作用域 - 这允许为长时间的API访问请求刷新令牌:

    1. new Client
    2. {
    3. ClientId = "mvc",
    4. ClientName = "MVC Client",
    5. AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    6. ClientSecrets =
    7. {
    8. new Secret("secret".Sha256())
    9. },
    10. RedirectUris = { "http://localhost:5002/signin-oidc" },
    11. PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
    12. AllowedScopes =
    13. {
    14. IdentityServerConstants.StandardScopes.OpenId,
    15. IdentityServerConstants.StandardScopes.Profile,
    16. "api1"
    17. },
    18. AllowOfflineAccess = true
    19. };

    修改MVC客户端

    在MVC客户端的修改也是最小的 - ASP.NET Core OpenID Connect处理程序已经内置支持混合流程,所以我们只需要改变一些配置值。

    我们配置ClientSecret密钥和IdentityServer上匹配。 添加offline_accessapi1作用域,并将ResponseType设置为代码id_token(基本意思是“使用混合流”)

    1. .AddOpenIdConnect("oidc", options =>
    2. {
    3. options.SignInScheme = "Cookies";
    4. options.Authority = "http://localhost:5000";
    5. options.RequireHttpsMetadata = false;
    6. options.ClientId = "mvc";
    7. options.ClientSecret = "secret";
    8. options.ResponseType = "code id_token";
    9. options.SaveTokens = true;
    10. options.GetClaimsFromUserInfoEndpoint = true;
    11. options.Scope.Add("api1");
    12. options.Scope.Add("offline_access");
    13. });

    当你运行MVC客户端时,不会有太大的区别,除了同意界面现在要求你提供额外的API和offline access访问作用域。

    使用访问令牌

    OpenID Connect中间件会自动为您保存令牌(标识,访问和刷新)。 这就是SaveTokens设置的作用。

    技术上,令牌存储在cookie。 访问它们的最简单方法是使用Microsoft.AspNetCore.Authentication命名空间的扩展方法。

    例如在View上获取Token:

    1. <dt>access token</dt>
    2. <dd>@await ViewContext.HttpContext.GetTokenAsync("access_token")</dd>
    3. <dt>refresh token</dt>
    4. <dd>@await ViewContext.HttpContext.GetTokenAsync("refresh_token")</dd>

    要使用访问令牌访问API,您只需检索令牌,并将其设置在您的HttpClient上:

    1. public async Task CallApiUsingUserAccessToken()
    2. {
    3. var accessToken = await HttpContext.GetTokenAsync("access_token");
    4. var client = new HttpClient();
    5. client.SetBearerToken(accessToken);
    6. var content = await client.GetStringAsync("http://localhost:5001/identity");
    7. ViewBag.Json = JArray.Parse(content).ToString();
    8. return View("json");
    9. }
  • 相关阅读:
    Day20:算法篇之贪心算法
    MFC Windows 程序设计[327]之表格控件例程三(附源码)
    如何快速定位到报错日志中的关键信息,一招学会,赶快GET吧
    驱动代码整理
    登场即王炸!木牛4D成像雷达迭代升级,挑战高阶智驾感知最高性能
    什么是雷曼时刻(Lehman Moment)
    融云云盘,不止于存储
    黑马程序员 学成在线项目 第1章 项目介绍&环境搭建v3.1
    Postman使用实例
    Tomcat Java内存马 listener型
  • 原文地址:https://blog.csdn.net/weixin_71792169/article/details/127857015