访问被IdentityServer4保护的api时,取得token的方式

1、通过ClientId、ClientSecret来获得token,代码如下:

认证服务器端:

                    ClientId = client.ClientId,
                    ClientName = client.ClientName,
                    AllowedGrantTypes = GrantTypes.ClientCredentials,
                    ClientSecrets = { new Secret("123456".Sha256()) },
                    AllowedScopes = { client.Scope },
                    AllowOfflineAccess = true

客户端:

            var httpClient = new HttpClient();
            var disco = httpClient.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest
            {
                Address = System.Configuration.ConfigurationManager.AppSettings["AuthorizationCenterUrl"],
                Policy =
                {
                     RequireHttps=false
                }
            }).Result;
            if (disco.IsError)
            {
                throw new Exception(disco.Error);
            }
            var tokenResponse = httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
            {
                Address = disco.TokenEndpoint,
                ClientId = "localHtml",
                ClientSecret = "123456",
                Scope = "SourceApi"
            });
            string token = tokenResponse.Result.AccessToken;

2、通过用户名密码获得token

  首先认证服务器端需要允许当前AllowedScopes 

                    Client oneResult = new Client
                    {
                        ClientId = client.ClientId,
                        ClientName = client.ClientName,
                        AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
                        ClientSecrets = { new Secret("111111".Sha256()) },
                        AllowOfflineAccess = true,
                        RequireConsent = false,
                        RequireClientSecret = false,
                        AllowedScopes =
                        {
                            IdentityServerConstants.StandardScopes.OpenId,
                            IdentityServerConstants.StandardScopes.Profile,
                            IdentityServerConstants.StandardScopes.OfflineAccess,
                            "role",
                            "CommonAPI"
                        },
                        AuthorizationCodeLifetime = 36000,
                        IdentityTokenLifetime = 36000,
                        UserSsoLifetime = 36000
                    };

  然后用这个客户端id和用户名密码获得的token就可以有权限访问资源名称为:CommonAPI的数据

客户端:

uni.request({
                            url: baseUrl + '/connect/token',
                            method: 'POST',
                            header: {
                                'content-type': "application/x-www-form-urlencoded"
                            },
                            data: {
                                username: this.user_name,
                                password: this.password_encryptioned, //B942B751A119FB3146B40679638F38B9
                                grant_type: 'password',
                                client_id: 'localHtml'
                            },
                            success: res => {
                                if (res.statusCode === 200) {
                                    console.log(res);
                                    uni.setStorageSync('access_token', res.data.token_type + ' ' + res.data.access_token);
                                    uni.setStorageSync('user_name', this.user_name);
                                    uni.showToast({
                                        icon: 'none',
                                        title: '登录成功! '
                                    });
                                    uni.navigateTo({
                                        url:"../TypeSelect/TypeSelect"
                                    })
                                } else {
                                    uni.showToast({
                                        icon: 'none',
                                        title: '[' + res.statusCode +']登录失败!  请检查用户名/密码是否输入正确!',
                                        duration: 3000
                                    })
                                }
                            },
                            fail: () => {
                                uni.showToast({
                                    icon: 'none',
                                    title: '失败,请检查网络!',
                                    duration: 3000
                                })
                            }
                        })

然后利用这个token访问资源成功。

原文地址:https://www.cnblogs.com/wjx-blog/p/14743238.html