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

IdentityServer4授权和认证

 

 可以看到其他的默认配置,比如回调地址,登出地址

如果之前了解过授权和认证,对这个不陌生

//使用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);
                    }
                };
            });
View Code

相关文章:

猜你喜欢
相关资源
相似解决方案