IdentityServer4 简称ids4
oidc了解:http://www.jessetalk.cn/2018/04/04/oidc-asp-net-core/
是一个去中心化的网上身份认证系统,集成了认证和授权
博客园已经有很多大佬写过了。我也是跟着学,记录下学习成果
授权服务器代码:
var oidc = new Client { ClientId = "oidc", ClientName = "name", ClientSecrets = { new Secret("secret".Sha256()) }, ClientUri = "http://www.cnblogs.com", //客户端 LogoUri = "https://www.cnblogs.com/images/logo_small.gif", //AllowedGrantTypes={GrantType.AuthorizationCode } /* 如果客户端使用的认证是 */ AllowedGrantTypes = GrantTypes.Hybrid, AllowedScopes ={ IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, IdentityServerConstants.StandardScopes.Email, }, RedirectUris = { "http://localhost:5001/signin-oidc" }, PostLogoutRedirectUris = { "http://localhost:5001/signout-callback-oidc" } };
AllowedScopes 中的
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile必须的
也可以不用枚举类型。直接写:“openid”,"profile"
为什么说是必须定义的呢。因为ids4代码的封装。默认就添加了“openid”,"profile"两个scope
因为只有openid才能确定唯一性
而profile是用户资料信息
github地址:
https://github.com/aspnet/AspNetCore/blob/master/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs
可以看到其他的默认配置,比如回调地址,登出地址
如果之前了解过授权和认证,对这个不陌生
//使用ids中间件
app.UseIdentityServer();
认证代码,我自己写了挺多注释,可以忽略
services.AddAuthentication(options => { /* 要想使用认证系统,必要先注册Scheme 而每一个Scheme必须指定一个Handler AuthenticationHandler 负责对用户凭证的验证 这里指定的默认认证是cookie认证 Scheme可以翻译为方案,即默认的认证方案 因为这里用到了多个中间件,(AddAuthentication,AddCookie,AddOpenIdConnect) OpenIdConnectDefaults.DisplayName 的默认值是oidc 指定AddOpenIdConnect是默认中间件,在AddOpenIdConnect配置了很多选项 如果只用了一个中间件,则可以不写,是否还记得cookie认证 // services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) // .AddCookie(option => // { // ///Account/Login?ReturnUrl=%2Fadmin // option.LoginPath = "/login/index"; // //option.ReturnUrlParameter = "params"; //指定参数名称 // //option.Cookie.Domain // option.AccessDeniedPath = "/login/noAccess"; // option.Cookie.Expiration = TimeSpan.FromSeconds(4); // option.Events = new CookieAuthenticationEvents // { // OnValidatePrincipal = LastChangedValidator.ValidateAsync // }; // }); */ //options.DefaultScheme = "Cookies"; //默认的认证方案:cookie认证,信息是保存在cookie中的 options.DefaultAuthenticateScheme = "Cookies"; //oidc 就是openidConnect //名字随便取,只要AddOpenIdConnect中的的oidc名字一样即可, //这样才能找到 options.DefaultChallengeScheme = "oidc"; //默认使用oidc中间件 //options.DefaultChallengeScheme = OpenIdConnectDefaults.DisplayName; }).AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; options.Authority = "http://localhost:5003"; options.RequireHttpsMetadata = false; options.ClientId = "oidc"; options.ClientSecret = "secret"; options.SaveTokens = true; //options.Scope.Add("openid"); /* 默认值是:id_token */ //options.ResponseType = OpenIdConnectResponseType.CodeIdToken; options.Events = new OpenIdConnectEvents { /* 远程异常触发 在授权服务器取消登陆或者取消授权 */ OnRemoteFailure = OAuthFailureHandler => { //跳转首页 OAuthFailureHandler.Response.Redirect("/"); OAuthFailureHandler.HandleResponse(); return Task.FromResult(0); } }; });