zoukankan      html  css  js  c++  java
  • Authoriztion Code Flow

    1.IdentityServer项目中新建一个Client

    因为项目模板默认只添加了OpenId,Profile等IdentityResource。我们如果想获得其他的Scopes如图中的Email等,需进行以下添加:

     2. 创建MvcClient客户端,并配置StartUp.cs

     

    3.获取AccessToken及其他信息:

    启动IdentityServer服务器,启动MvcClient客户端。输入正确的账户密码后,身份认证将会成功,IdentityServer将会返回用户信息,且将AccessToken等一并带回:

     

    可以看到除了基本信息之外,我们刚刚给他添加的email等Scope也成功被授权访问成功。

     4.访问Api资源:

    首先我们需要一个访问Api的方法:

    获取RefreshToken的方法:

     1 private async Task<string> RenewTokenAsync()
     2         {
     3             var client = new HttpClient();
     4             var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");
     5 
     6             if (disco.IsError)
     7             {
     8                 throw new Exception(disco.Error);
     9             }
    10 
    11             // Get OpenIdConnect中规定的RefreshToken类型
    12             var refreshToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.RefreshToken);
    13 
    14             //从授权服务器中获取RefreshTokenId
    15             var tokenResponse = await client.RequestRefreshTokenAsync(new RefreshTokenRequest
    16             {
    17                 //以下为Get RefreshTokenId必填的参数
    18 
    19                 Address = disco.TokenEndpoint,
    20                 ClientId = "mvc client",
    21                 ClientSecret = "mvc secret",
    22                 Scope = "scope1 openid profile email phone address",
    23                 GrantType = OpenIdConnectGrantTypes.RefreshToken,
    24                 RefreshToken = refreshToken
    25             });
    26 
    27             if (tokenResponse.IsError)
    28             {
    29                 throw new Exception(tokenResponse.Error);
    30             }
    31             else
    32             {
    33                 var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResponse.ExpiresIn);
    34 
    35                 var tokens = new[]
    36                 {
    37                     new AuthenticationToken
    38                     {
    39                         Name = OpenIdConnectParameterNames.IdToken,
    40                         Value = tokenResponse.IdentityToken
    41                     },
    42 
    43                     new AuthenticationToken
    44                     {
    45                         Name = OpenIdConnectParameterNames.AccessToken,
    46                         Value = tokenResponse.AccessToken
    47                     },
    48 
    49                     new AuthenticationToken
    50                     {
    51                         Name = OpenIdConnectParameterNames.RefreshToken,
    52                         Value = tokenResponse.RefreshToken
    53                     },
    54 
    55                     new AuthenticationToken
    56                     {
    57                         Name = "expires_at",
    58                         Value = expiresAt.ToString("O", CultureInfo.InvariantCulture)
    59                     }
    60                 };
    61 
    62                 //获取身份认证的结果 包含当前的Principal Properties
    63                 var currentAuthenticationResult =
    64                     await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);
    65 
    66                 //将通过RefreshToken获取的新的Token存起来
    67                 currentAuthenticationResult.Properties.StoreTokens(tokens);
    68 
    69                 //重新获取授权并登录
    70                 await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, currentAuthenticationResult.Principal, currentAuthenticationResult.Properties);
    71 
    72                 return tokenResponse.AccessToken;
    73             }
    74         }

     成功访问到Api1的资源:

     等待我们设置的一分钟后,能获取到RefreshToken刷新获得Api1资源。

  • 相关阅读:
    jQuery——能够编辑的表格
    最简单的Windows程序
    数据库分页查询
    Srvctl命令具体解释(10g)
    AT3912 Antennas on Tree
    使用GenericServlet实例
    Servlet接口、GenericServlet类、HttpServlet类
    Servlet简介
    MVC
    为JSP写的一套核心标签
  • 原文地址:https://www.cnblogs.com/Xieyiincuit/p/13832173.html
Copyright © 2011-2022 走看看