zoukankan      html  css  js  c++  java
  • IdentityServer4【QuickStart】之切换到混合流并且添加API访问

    切换到混合流并且添加API访问

    前面的示例中我们开发了API访问和用户认证,现在我们要将两个合并到一起。

    OpenID Connect&OAuth 2.0组合的美妙之处是,你可以使用单一协议和与令牌服务进行单一交换来实现这两种功能。

    前面的示例中我们使用过了OpenId Connect的隐式流程(implicit flow)。在隐式流程中所有的token都是通过浏览器进行传输,这对于id token来说没有什么问题的,但是现在我们想要请求一个access token。

    access token要比id token更敏感一些,并且如果没有什么必要的话我们并不像让它暴露在外部环境中。OpenID Connect包含了一个叫做“混合”流程,这个流程能给予我们上面说的最好的解决方式----id token通过浏览器通道传输,这样客户端可以在做其他工作之前验证它,并且,如果验证成功,客户端会打开一个后端通道来从token service检索acecss token。

    修改客户端配置

    做这项工作并没有太多需要修改的地方,首先我们先要让客户端使用混合流程,然后我们还想让客户端和API之间执行一些服务端到服务端的调用,在这个过程中并没有用户参与(这个和client credentials流程相似)。这个是通过使用AllowedGrantTypes属性实现的。

    下一步我们需要添加一个client secret。这个会在后端通道用来检索access token。

    最后,我们也允许客户端拥有了offline_access这个scope的访问权限,这允许请求一个刷新令牌来实现长时间的API访问。

    new Client
    {
        ClientId = "mvc",
        ClientName = "MVC Client",
        AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
    
        ClientSecrets =
        {
            new Secret("secret".Sha256())
        },
    
        RedirectUris           = { "http://localhost:5002/signin-oidc" },
        PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
    
        AllowedScopes =
        {
            IdentityServerConstants.StandardScopes.OpenId,
            IdentityServerConstants.StandardScopes.Profile,
            "api1"
        },
        AllowOfflineAccess = true
    };

    修改MVC客户端

    对于客户端来说变化也不大,asp.net core中的Openid connect handler已经内置了对混合流程的支持,所以我们只需要修改一些配置值。

    我们将ClientSecret配置成匹配IdentityServer上面配置的值。添加offline_access和api1这两个scope,并且将resonsetype设置成code id_token(意思就是告诉mvc客户端我要使用混合流程)。

    .AddOpenIdConnect("oidc", options =>
    {
        options.SignInScheme = "Cookies";
    
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;
    
        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code id_token";
    
        options.SaveTokens = true;
        options.GetClaimsFromUserInfoEndpoint = true;
    
        options.Scope.Add("api1");
        options.Scope.Add("offline_access");
    });

    当你运行MVC客户端,发现没由什么太大变化,除了确认页面现在多了API和offline access的scope请求。

    使用access token

    OpenID Connect中间件自动将一些token(目前有id token、access token、refresh token)为你保存好了。这是设置SaveTokens的意义。

    从技术上讲,令牌存储在cookie的属性部分中。访问他们最简单的方式就是使用Microsoft.AspNetCore.Authentication这个命名空间。

    比方说在你有一个展示claim的视图:

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

    为了要使用access token去访问API,你需要获取token,然后在HttpClient中设置它:

    public async Task<IActionResult> CallApiUsingUserAccessToken()
    {
        var accessToken = await HttpContext.GetTokenAsync("access_token");
    
        var client = new HttpClient();
        client.SetBearerToken(accessToken);
        var content = await client.GetStringAsync("http://localhost:5001/identity");
    
        ViewBag.Json = JArray.Parse(content).ToString();
        return View("json");
    }
  • 相关阅读:
    Matlab2014+VS2013配置vlfeat0.9.20 2016-10-27 15:03 223人阅读 评论(0) 收藏
    scikit-learn SVM使用和学习 2016-08-21 16:34 214人阅读 评论(0) 收藏
    python部落习题笔记 标签: python 2016-07-14 16:08 248人阅读 评论(0) 收藏
    NBNN及SIS Measure 标签: 稀疏相似度度量NBNNSIS分类 2016-04-16 10:49 754人阅读 评论(0)
    压缩感知的MP算法 标签: 压缩感知稀疏表示MP算法 2016-03-19 20:41 594人阅读 评论(0)
    K-means 处理 RGB 图像 标签: clusteringkmeansRGBmatlab 2015-08-16 16:49 255人阅读
    C++ Primer Plus 第6版 中文版随书笔记 标签: c++ 2015-07-22 18:58 205人阅读 评论(0)
    3D 数据的获取和读入 标签: matlab3D 图像 2015-04-19 11:52 387人阅读 评论(0)
    Python学习笔记九:文件I/O
    Python学习笔记八:模块
  • 原文地址:https://www.cnblogs.com/pangjianxin/p/9376363.html
Copyright © 2011-2022 走看看