二.客户端凭据的认证方式( 二 )


具体查看gitee代码:
4.保护WPF客户端
这种是有用户参与的,使用的是Grant (用名名密码)这种授权方式 。
1.流程
【二.客户端凭据的认证方式】运行的顺序和字母的顺序是一致的:
所以在这个过程之中,即对用户进行身份认证,也对浏览器进行身份认证 。
具体操作看代码吧 。我也没用过MVC
2.为MVC刷新 token
使用Token 刷新Token 。
1.在MVC 客户端进行设置
new Client{ClientId = "mvc client",ClientName = "ASP.NET Core MVC Client", // 随便写AllowedGrantTypes = GrantTypes.CodeAndClientCredentials,//允许两种授权方式.ClientSecrets = { new Secret("mvc secret".Sha256()) },//密码.//下边都是固定的地址 。RedirectUris = { "http://localhost:5002/signin-oidc" },FrontChannelLogoutUri = "http://localhost:5002/signout-oidc",PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },AlwaysIncludeUserClaimsInIdToken = true,AllowOfflineAccess = true, // offline_access//默认是一个小时 。现在改成 60s。AccessTokenLifetime = 60, // 60 secondsAllowedScopes ={"api1",IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Email,IdentityServerConstants.StandardScopes.Address,IdentityServerConstants.StandardScopes.Phone,IdentityServerConstants.StandardScopes.Profile}},
但是仅仅这样设置,过了一分钟以后,进入 MVC ,依然还能得到 API 的相关信息。这是因为我们的 API 没有设置对于 对于token检验 。
2.对受保护的 API进行设置
services.AddAuthentication("Bearer")//bearer 的授权方式 。.AddJwtBearer("Bearer", options =>{options.Authority = "https://localhost:5000";options.RequireHttpsMetadata = http://www.kingceram.com/post/false;//不需要httpsoptions.TokenValidationParameters = newTokenValidationParameters{ValidateAudience = false};//每隔一分钟,验证一次这个tokenoptions.TokenValidationParameters.RequireExpirationTime = true;//必须要有超时时间这个参数 。options.TokenValidationParameters.ClockSkew = TimeSpan.FromMinutes(1);});
3.刷新 Token
在 MVC 的控制器里面,再添加一个,用来刷新 Token 。
//刷新 tokenprivate async Task RenewTokensAsync(){//发现文档var client = new HttpClient();var disco = await client.GetDiscoveryDocumentAsync("http://localhost:5000");if (disco.IsError){throw new Exception(disco.Error);}//获取 refreshTokenvar refreshToken = await HttpContext.GetTokenAsync(OpenIdConnectParameterNames.RefreshToken);//请求tokenvar tokenResponse = await client.RequestRefreshTokenAsync(new RefreshTokenRequest{Address = disco.TokenEndpoint,ClientId = "mvc client",ClientSecret = "mvc secret",Scope = "api1 openid profile email phone address",GrantType = OpenIdConnectGrantTypes.RefreshToken,RefreshToken = refreshToken});if (tokenResponse.IsError){throw new Exception(tokenResponse.Error);}//超时时间,使用的是 UTC 时间 。var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResponse.ExpiresIn);// 把 token 数组全部集中起来,做成一个数组 。var tokens = new[]{new AuthenticationToken{Name = OpenIdConnectParameterNames.IdToken,Value = http://www.kingceram.com/post/tokenResponse.IdentityToken},new AuthenticationToken{Name = OpenIdConnectParameterNames.AccessToken,Value = tokenResponse.AccessToken},new AuthenticationToken{Name = OpenIdConnectParameterNames.RefreshToken,Value = tokenResponse.RefreshToken},new AuthenticationToken{Name ="expires_at",Value = http://www.kingceram.com/post/expiresAt.ToString("o", CultureInfo.InvariantCulture)}};// 获取身份认证的结果,包含当前的pricipal和propertiesvar currentAuthenticateResult =await HttpContext.AuthenticateAsync(CookieAuthenticationDefaults.AuthenticationScheme);// 把获得的token再更新一遍 。currentAuthenticateResult.Properties.StoreTokens(tokens);// 再进行以下登录动作.await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,currentAuthenticateResult.Principal, currentAuthenticateResult.Properties);// 再把 access token 返回过去.return tokenResponse.AccessToken;}