网站建设服务器技术有哪些,微信小程序卖货平台,动漫制作与设计专业,如何使用jq做弹幕网站关于 OAuth 2.0 的相关内容#xff0c;点击查看#xff1a;ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统。对于支持 OpenID 的网站#xff0c;用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是#xff0c;他们只需要预先在一… 关于 OAuth 2.0 的相关内容点击查看ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统。对于支持 OpenID 的网站用户不需要记住像用户名和密码这样的传统验证标记。取而代之的是他们只需要预先在一个作为 OpenID 身份提供者identity provider, IdP的网站上注册。OpenID 是去中心化的任何网站都可以使用 OpenID 来作为用户登录的一种方式任何网站也都可以作为 OpenID 身份提供者。OpenID 既解决了问题而又不需要依赖于中心性的网站来确认数字身份。 OpenID 相关基本术语 最终用户End User想要向某个网站表明身份的人。标识Identifier最终用户用以标识其身份的 URL 或 XRI。身份提供者Identity Provider, IdP提供 OpenID URL 或 XRI 注册和验证服务的服务提供者。依赖方Relying Party, RP想要对最终用户的标识进行验证的网站。 以上概念来自https://zh.wikipedia.org/wiki/OpenID 针对 .NET Core 跨平台微软官方并没有针对 OAuth 2.0 的实现Microsoft.AspNetCore.Authentication.OAuth组件仅限客户端IdentityServer4 实现了 ASP.NET Core 下的 OpenID Connect 和 OAuth 2.0IdentityServer4 也是微软基金会成员。 阅读目录 OpenID 和 OAuth 的区别客户端模式Client Credentials密码模式resource owner password credentials简化模式-With OpenIDimplicit grant type简化模式-With OpenID OAuthJS 客户端调用混合模式-With OpenID OAuthHybrid FlowASP.NET Core Identity and Using EntityFramework Core for configuration data 开源地址https://github.com/yuezhongxin/IdentityServer4.Demo 1. OpenID 和 OAuth 的区别 简单概括 OpenIDauthentication认证用户是谁OAuthauthorization授权用户能做什么 其实OAuth 的密码授权模式和 OpenID 有些类似但也不相同比如用户登录落网选择微博快捷登录方式大致的区别 OAuth用户在微博授权页面输入微博的账号和密码微博验证成功之后返回 access_token然后落网拿到 access_token 之后再去请求微博的用户 API微博授权中心验证 access_token如果验证通过则返回用户 API 的请求数据给落网。OpenID落网可以没有用户的任何实现落网需要确认一个 URL 标识可以是多个然后用户登录的时候选择一个 URL 进行登录比如微博跳转到微博 OpenID 登录页面用户输入微博的账号和密码微博验证成功之后按照用户的选择返回用户的一些信息。 可以看到OAuth 首先需要拿到一个授权access_token然后再通过这个授权去资源服务器具体的 API获取想要的一些数据上面示例中用户 API 只是资源服务器的一种可以是视频 API、文章 API 等等在这个过程中OAuth 最重要的就是获取授权四种模式获取到授权之后你就可以通过这个授权做授权范围之类的任何事了。 而对于 OpenID 来说授权和它没任何关系它只关心的是用户比如落网可以不进行用户的任何实现具体体现就是数据库没有 User 表然后使用支持 OpenID 的服务比如微博通过特定的 URL 标识可以看作是 OpenID 标识然后输入提供服务的账号和密码返回具体的用户信息对于落网来说它关心的是用户信息仅此而已。 上面其实是 OAuth 的授权所以会有“获得以下权限”提示如果是 OpenID 的话“权限”应该改为“用户信息”。 支持 OpenID 的服务列表http://openid.net/get-an-openid/ OpenID 流程图来自 Using OpenID 2. 客户端模式Client Credentials 简单概述客户端提供 ClientId 和 ClientSecret 给认证授权服务验证如果成功返回 access_token客户端拿到 access_token访问 API 资源服务。 2.1 认证授权服务配置 创建 ASP.NET Core 站点Startup 配置修改如下 p IdentityServer4 中AddInMemory的相关配置都是 Mock 的代码配置也可以把这些配置存储在数据库中这个后面再讲。 AddInMemoryApiResources 增加的 API 资源服务List 集合也就此认证授权服务所管辖的 API 资源比如上面配置的 api1这个会在客户端调用的时候用到如果不一致是不允许访问的另外Clinet 中配置的AllowedScopes { api1 }表示此种授权模式允许的 API 资源集合前提是需要添加ApiResource。 配置很简单我们也可以访问http://localhost:5000/.well-known/openid-configuration查看具体的配置信息 2.2 API 资源服务配置 API 资源服务站点需要添加程序包 IdentityServer4.AccessTokenValidation: 1.0.1 添加一个ValuesController [Route([controller])]
[Authorize]public class ValuesController : ControllerBase{[HttpGet] public IActionResult Get() { return Content(hello world);}
} 2.3 单元测试 需要添加程序包 IdentityModel: 2.0.0 单元测试代码 很简单和我们之前用 ASP.NET WebApi OWIN 实现 OAuth 2.0 一样只不过配置和调用简化了很多因为 IdentityServer4 替我们做了很多工作。 3. 密码模式resource owner password credentials 简单概述客户端提供 UserName 和 Password 给认证授权服务验证如果成功返回 access_token客户端拿到 access_token访问 API 资源服务。 3.1 认证授权服务配置 创建 ASP.NET Core 站点Startup 配置修改如下 public class Startup{ public void ConfigureServices(IServiceCollection services) { // configure identity server with in-memory stores, keys, clients and scopesservices.AddIdentityServer().AddTemporarySigningCredential().AddInMemoryApiResources(new ListApiResource{ new ApiResource(api1, My API)}).AddInMemoryClients(new ListClient{ // resource owner password grant clientnew Client{ClientId ro.client,AllowedGrantTypes GrantTypes.ResourceOwnerPassword,ClientSecrets { new Secret(secret.Sha256())},AllowedScopes { api1 }}}).AddTestUsers(new ListTestUser{ new TestUser{SubjectId 1,Username xishuai,Password 123}});} public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) {loggerFactory.AddConsole(LogLevel.Debug);app.UseDeveloperExceptionPage();app.UseIdentityServer();}
} 和客户端模式不同的是AllowedGrantTypes授权模式改为了ResourceOwnerPassword然后增加了测试用户用来验证用户名和密码也可以存储在数据库中。 3.2 API 资源服务配置 API 资源服务站点需要添加程序包 IdentityServer4.AccessTokenValidation: 1.0.1 添加一个IdentityController [Route([controller])]
[Authorize]public class IdentityController : ControllerBase{[HttpGet] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value });}
} 3.3 单元测试 需要添加程序包 IdentityModel: 2.0.0 单元测试代码 4. 简化模式-With OpenIDimplicit grant type 简化模式在 IdentityServer4 中的实现就是 OpenID Connect。 简单概述客户端确定 URL用户认证服务登录在用户认证服务验证成功返回客户端想要的用户数据并使此用户为登录状态可以在客户端进行注销用户。 4.1 认证授权服务配置 创建 ASP.NET Core 站点Startup 配置修改如下 AddInMemoryIdentityResources和AllowedScopes所配置的是客户端允许访问的用户信息具体查看Requesting Claims using Scope Values ClientId 很重要必须和客户端一一对应所以想要使用 OpenID 认证服务的客户端需要向提供 OpenID 认证服务的机构申请一个 ClientIdOpenID 认证服务会统一发放一个用户登录的 URL。 TestUser中的Claims配置其实就是IdentityServerConstants.StandardScopes.Profile。 另外还有用户登录的一些操作代码这边就不贴了可以查看具体的实现ImplicitServer.Web 4.2 客户端服务配置 创建 ASP.NET Core 站点添加程序包 Microsoft.AspNetCore.Authentication.Cookies: 1.0.*,Microsoft.AspNetCore.Authentication.OpenIdConnect: 1.0.* Startup 配置修改如下 UseOpenIdConnectAuthentication配置中的Authority就是 OpenID 认证服务的 URL。 添加一个HomeController 访问 Secure 页面跳转到认证服务地址进行账号密码登录Logout 用于用户的注销操作。 4.3 Web 测试 5. 简化模式-With OpenID OAuthJS 客户端调用 简单概述客户端确定 URL用户认证服务登录在用户认证服务验证成功返回客户端想要的用户数据 和 access_token并使此用户为登录状态可以在客户端进行注销用户客户端可以拿到 access_token去访问授权范围之内的 API 资源。 需要注意的是因为简化模式所以 access_token 是作为 URL 参数返回的。 5.1 认证授权服务配置 创建 ASP.NET Core 站点Startup 配置修改如下 public class Startup{ public void ConfigureServices(IServiceCollection services) { // configure identity server with in-memory stores, keys, clients and scopesservices.AddIdentityServer().AddTemporarySigningCredential().AddInMemoryIdentityResources(new ListIdentityResource{ new IdentityResources.OpenId(), new IdentityResources.Profile(),}).AddInMemoryApiResources(new ListApiResource{ new ApiResource(api1, My API)}).AddInMemoryClients(new ListClient{ // OpenID Connect implicit flow client (MVC)new Client{ClientId js,ClientName JavaScript Client,AllowedGrantTypes GrantTypes.Implicit,AllowAccessTokensViaBrowser true,RedirectUris { http://localhost:5022/callback.html },PostLogoutRedirectUris { http://localhost:5022/index.html },AllowedCorsOrigins { http://localhost:5022 },AllowedScopes {IdentityServerConstants.StandardScopes.OpenId,IdentityServerConstants.StandardScopes.Profile, api1}}}).AddTestUsers(new ListTestUser{ new TestUser{SubjectId 1,Username xishuai,Password 123,Claims new ListClaim{ new Claim(name, xishuai), new Claim(website, http://xishuai.cnblogs.com)}}});} public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) {loggerFactory.AddConsole(LogLevel.Debug);app.UseDeveloperExceptionPage();app.UseIdentityServer();}
} 因为涉及到访问 API 资源操作需要需要添加AddInMemoryApiResources配置AllowedScopes也需要添加对应的 API 资源名称AllowAccessTokensViaBrowser true的配置的作用就是可以在浏览器地址中访问 access_token。 更多实现代码点击查看ImplicitServerWithJS.Web 5.2 API 资源服务配置 API 资源服务站点需要添加程序包 IdentityServer4.AccessTokenValidation: 1.0.1,Microsoft.AspNetCore.Cors: 1.1.0 Startup 配置修改如下 因为 JS 需要跨域访问 API 资源服务所以需要增加 CORS 配置。 添加一个IdentityController [Route([controller])]
[Authorize]public class IdentityController : ControllerBase{[HttpGet] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value });}
} 5.3 JS Web 站点测试 创建一个 ASP.NET Core 站点添加oidc-client.js前端组件测试 JS 代码 /// reference pathoidc-client.js /function log() {document.getElementById(results).innerText ;Array.prototype.forEach.call(arguments, function (msg) {if (msg instanceof Error) {msg Error: msg.message;}else if (typeof msg ! string) {msg JSON.stringify(msg, null, 2);}document.getElementById(results).innerHTML msg \r\n;});}document.getElementById(login).addEventListener(click, login, false);document.getElementById(api).addEventListener(click, api, false);document.getElementById(logout).addEventListener(click, logout, false);var config {authority: http://localhost:5003,client_id: js,redirect_uri: http://localhost:5022/callback.html,response_type: id_token token,scope:openid profile api1,post_logout_redirect_uri: http://localhost:5022/index.html,}; var mgr new Oidc.UserManager(config);mgr.getUser().then(function (user) {if (user) {log(User logged in, user.profile);}else {log(User not logged in);}});function login() {mgr.signinRedirect();}function api() {mgr.getUser().then(function (user) {var url http://localhost:5012/identity;var xhr new XMLHttpRequest();xhr.open(GET, url);xhr.onload function () {log(xhr.status, JSON.parse(xhr.responseText));}xhr.setRequestHeader(Authorization, Bearer user.access_token);xhr.send();});}function logout() {mgr.signoutRedirect();} 测试过程注意下 URL 中的参数 6. 混合模式-With OpenID OAuthHybrid Flow 混合模式Hybrid Flow是一种新的模式是简化模式implicit flow和验证码模式authorization code flow的混合。 简单概述客户端确定 URL用户认证服务登录在用户认证服务验证成功返回客户端想要的用户数据 和 access_token并使此用户为登录状态可以在客户端进行注销用户客户端可以拿到 access_token去访问授权范围之内的 API 资源。 和上面的简化模式流程差不多不过 access_token 不是通过浏览器获取的而是通过后台服务获取。 6.1 认证授权服务配置 创建 ASP.NET Core 站点Startup 配置修改如下 AllowedGrantTypes配置改为HybridAndClientCredentialsAllowOfflineAccess需要设置为true。 更多实现代码点击查看HybridServer.Web 6.2 API 资源服务配置 API 资源服务站点需要添加程序包 IdentityServer4.AccessTokenValidation: 1.0.1 Startup 配置修改如下 添加一个IdentityController [Route([controller])]
[Authorize]public class IdentityController : ControllerBase{[HttpGet] public IActionResult Get() { return new JsonResult(from c in User.Claims select new { c.Type, c.Value });}
} 6.3 客户端服务配置 创建 ASP.NET Core 站点添加程序包 Microsoft.AspNetCore.Authentication.Cookies: 1.0.*,Microsoft.AspNetCore.Authentication.OpenIdConnect: 1.0.*,IdentityModel: 2.0.0 Startup 配置修改如下 CallApiUsingClientCredentials是通过客户端模式获取 access_tokenCallApiUsingUserAccessToken是通过上下文获取保存的 access_token其实和浏览器 URL 中获取是一样的意思但需要配置SaveTokens true。 6.4 Web 测试 7. ASP.NET Core Identity and Using EntityFramework Core for configuration data 使用 ASP.NET Core Identity就是用户管理不由 OpenID 认证服务进行提供ASP.NET Core Identity 就相当于用户的一个管理者比如用户的存储等。 我没做这一块的示例配置比较简单 public void ConfigureServices(IServiceCollection services){services.AddDbContextApplicationDbContext(options options.UseSqlServer(Configuration.GetConnectionString(DefaultConnection)));services.AddIdentityApplicationUser, IdentityRole().AddEntityFrameworkStoresApplicationDbContext().AddDefaultTokenProviders();services.AddMvc();services.AddTransientIEmailSender, AuthMessageSender();services.AddTransientISmsSender, AuthMessageSender(); // Adds IdentityServerservices.AddIdentityServer().AddTemporarySigningCredential().AddInMemoryIdentityResources(Config.GetIdentityResources()).AddInMemoryApiResources(Config.GetApiResources()).AddInMemoryClients(Config.GetClients()).AddAspNetIdentityApplicationUser();
} 详细使用Using ASP.NET Core Identity 关于 IdentityServer4 的配置信息可以使用 EntityFramework Core 进行存储配置如下 public void ConfigureServices(IServiceCollection services){services.AddMvc(); var connectionString server(localdb)\mssqllocaldb;databaseIdentityServer4.Quickstart;trusted_connectionyes; var migrationsAssembly typeof(Startup).GetTypeInfo().Assembly.GetName().Name; // configure identity server with in-memory users, //but EF stores for clients and resourcesservices.AddIdentityServer().AddTemporarySigningCredential().AddTestUsers(Config.GetUsers()).AddConfigurationStore(builder builder.UseSqlServer(connectionString, options options.MigrationsAssembly(migrationsAssembly))).AddOperationalStore(builder builder.UseSqlServer(connectionString, options options.MigrationsAssembly(migrationsAssembly)));
} 详细使用Using EntityFramework Core for configuration data 最后简要总结下使用 IdentityServer4 的几种应用场景 客户端模式Client Credentials和用户无关用于应用程序与 API 资源的直接交互场景。密码模式resource owner password credentials和用户有关一般用于第三方登录。简化模式-With OpenIDimplicit grant type仅限 OpenID 认证服务用于第三方用户登录及获取用户信息不包含授权。简化模式-With OpenID OAuthJS 客户端调用包含 OpenID 认证服务和 OAuth 授权但只针对 JS 调用URL 参数获取一般用于前端或无线端。混合模式-With OpenID OAuthHybrid Flow推荐使用包含 OpenID 认证服务和 OAuth 授权但针对的是后端服务调用。 开源地址https://github.com/yuezhongxin/IdentityServer4.Demo 参考资料 IdentityServer4IdentityServer4.SamplesWelcome to IdentityServer4Welcome to OpenID ConnectOpenID 学习笔记OAuth 和 OpenID 的区别OAuth、OAuth 与 OpenID 区别和联系使用 OpenID、OAuth 和 Facebook Connect 武装你的站点OpenID Connect 身份认证标准推出获谷歌微软支持 原文地址http://www.cnblogs.com/xishuai/p/identityserver4-implement-openid-connect-and-oauth2.html.NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注