在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器

新建 ASP.NET Core Identity 项目

在新建ASP.NET Core Web 应用程序 窗口中分别选择:ASP.NET Core 2.0Web应用程序(模型视图控制器)个人用户账号

项目建立后, 运行方式改为使用控制台运行而不是IISExpress, 以便查看各种debug信息.

打开launchSettings.json:

{
  "profiles": {
    "IdentityManagerServer": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      },
      "applicationUrl": "http://localhost:5000/"
    }
  }
}

把IISExpress相关的内容删掉, 然后端口改为5000。

Program.cs里的BuildWebHost也应该加上Url:

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseUrls("http://*:5000")
                .UseKestrel()
                .Build();

项目名称上右键,选择 编辑IdentityManagerServer.csproj

项目最终部署在 Ubuntu Server 上,发布时要把服务器需要的包全部发布出来,通过在 csjproj 文件中增加以下一行来实现这个目的:

<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>

看起来象下行这个样子:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
    <UserSecretsId>aspnet-IdentityManagerServer-47CFE0C9-3D63-4880-B670-22AD145CF51C</UserSecretsId>
  </PropertyGroup>

没有添加上面那一行,发布后在 Ubuntu 上运行时会显示类似以下的错误:

Error:

An assembly specified in the application dependencies manifest (..deps.json) was not found:

package: ‘Microsoft.AspNetCore.Antiforgery‘, version: ‘2.0.3‘

path: ‘lib/netstandard2.0/Microsoft.AspNetCore.Antiforgery.dll‘

This assembly was expected to be in the local runtime store as the application was published using the following target manifest files:

aspnetcore-store-2.0.8.xml

使用 MariaDB/MySQL 数据库

NuGet 中添加 MySql.Data.EntityFrameworkCore

修改数据库的连接字符串

打开 appsettings.josn 文件,找到类似以下内容的连接字符串:

  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentityManagerServer-47CFE0C9-3D63-4880-B670-22AD145CF51C;Trusted_Connection=True;MultipleActiveResultSets=true"
 },

修改为以下的样子,(此处将原来的连接字符串注释掉,并添加新的):


  //"ConnectionStrings": {
  //  "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-IdentityManagerServer-47CFE0C9-3D63-4880-B670-22AD145CF51C;Trusted_Connection=True;MultipleActiveResultSets=true"
  //},
  "ConnectionStrings": {
    "DefaultConnection": "Server=127.0.0.1;Database=aspnet-IdentityManagerServer-180725;userid=root;pwd=123456;port=3306;sslmode=none;"
  },
 

如果有云主机或服务器,请将 Server=127.0.0.1 中的IP替换为数据库服务器的实际IP。

使用依赖注入创建 MySQL 的 DbContext 实例

打开当前项目中的 Startup.cs 文件,找到ConfigureServices 中原来使用 SqlServer 的数据上下文的代码

     services.AddDbContext<ApplicationDbContext>(options =>
         options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

将其更改为使用 MySQL 数据库:

     services.AddDbContext<ApplicationDbContext>(options =>
        options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));

将原来使用 UseSqlServer 的语句注释并添加 UseMySQL 后的完整代码如下:

     services.AddDbContext<ApplicationDbContext>(options =>
        options.UseMySQL(Configuration.GetConnectionString("DefaultConnection")));
     // services.AddDbContext<ApplicationDbContext>(options =>
     //     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

用户的密码选项及其他 Identity 选项

ConfigureServices 中的 services.AddIdentity 语句结束之后另起一行添加以下内容:

services.Configure<IdentityOptions>(options =>
     {
        // Password settings 密码设置
        options.Password.RequireDigit = false;    //必须数字
        options.Password.RequiredLength = 6;   //密码最小长度
        options.Password.RequireNonAlphanumeric = false;  //必须 有数字、字母以外的其他字符
        options.Password.RequireUppercase = false;  //必须 有大写字母
        options.Password.RequireLowercase = false;  //必须 有小写字母
        options.Password.RequiredUniqueChars = 6;

        // Lockout settings
        options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
        options.Lockout.MaxFailedAccessAttempts = 10;
        options.Lockout.AllowedForNewUsers = true;

         // User settings
        options.User.RequireUniqueEmail = true;
    });

services.ConfigureApplicationCookie(options =>
     {
         // Cookie settings
        options.Cookie.HttpOnly = true;
        options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
        // If the LoginPath isn‘t set, ASP.NET Core defaults
        // the path to /Account/Login.
        options.LoginPath = "/Account/Login";
         // If the AccessDeniedPath isn‘t set, ASP.NET Core defaults
         // the path to /Account/AccessDenied.
         options.AccessDeniedPath = "/Account/AccessDenied";
        options.SlidingExpiration = true;
     });

程序调试运行的时候,不想每次都输入特别复杂的密码,所以 在上面 Password settings 中将各个选项都设为了 false,等实际部署时,应视情况需要设置。

安装 IdentityServer 的NuGet包

NuGet 中添加 IdentityServer4.AspNetIdentity 包,这个包依赖于 IdentityServer4,安装 IdentityServer4.AspNetIdentity 的时候会自动把 IdentityServer4也一起装上:

添加 IdentiryServer4 配置文件

在项目中新建 Configuration\Config.cs 文件,并修改为如下内容:

using IdentityServer4;
using IdentityServer4.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace IdentityManagerServer.Configuration
{
    public class Config
    {
        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>
            {
                new ApiResource("socialnetwork", "社交网络")
                {
                    UserClaims = new [] { "email" }
                }
            };
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>
            {
                new Client
                {
                    ClientId = "socialnetwork",
                    ClientSecrets = new [] { new Secret("secret".Sha256()) },
                    AllowedGrantTypes = GrantTypes.ResourceOwnerPasswordAndClientCredentials,
                    AllowedScopes = new [] { "socialnetwork" }
                },
                new Client
                {
                    ClientId = "mvc_code",
                    ClientName = "MVC Client",
                    AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
                    RequireConsent = false, //是否需要用户点击确认进行跳转
                    ClientSecrets =
                    {
                        new Secret("secret".Sha256())
                    },
                    RedirectUris = { "http://localhost:5002/signin-oidc" },
                    PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        IdentityServerConstants.StandardScopes.Email,
                        "socialnetwork"
                    },
                    AllowOfflineAccess = true,
                    AllowAccessTokensViaBrowser = true
                }
            };
        }

        public static IEnumerable<IdentityResource> GetIdentityResources()
        {
            return new List<IdentityResource>
            {
                new IdentityResources.OpenId(),
                new IdentityResources.Profile(),
                new IdentityResources.Email()
            };
        }
    }
}

Startup.cs 配置 IdentityServer

ConfigureServices 的末尾添加 AddIdentityServer() 的相关配置,部分代码如以下内容所示:

            // Add application services.
            services.AddTransient<IEmailSender, EmailSender>();

            services.AddMvc();

            // configure identity server with in-memory stores, keys, clients and scopes
            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryPersistedGrants()
                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                .AddInMemoryApiResources(Config.GetApiResources())
                .AddInMemoryClients(Config.GetClients())
                .AddAspNetIdentity<ApplicationUser>();

Configure 中用 UseIdentityServer 替换掉 UseAuthentication,效果如以下代码:

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseBrowserLink();
                app.UseDeveloperExceptionPage();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseStaticFiles();

            //app.UseAuthentication(); //UseIdentityServer中已经包含有此功能
            app.UseIdentityServer();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }

创建用户数据库

鉴于这是一个新的 ASP.NET Identity 项目,需要创建数据库(二个方法选其中一个就可以)。

一、可以通过从项目目录运行命令提示符并运行以下命令来执行此操作:

dotnet ef database update -c ApplicationDbContext

如下所示:

二、也可以在 VS2017 的 程序包管理器控制台 输入以下命令:

update-database  -c ApplicationDbContext

运行程序

启动应用程序 ,并点击链接 "Register" 创建一个新用户。

获取Token

FireFox 浏览器 中安装并运行RESTClient 插件,添加 HTTP头字段

请求方法为:POST,网址为 :http://localhost:5000/connect/token

编辑正文:

其中的 username 的值:[email protected]password 的值:123456 为上一步骤注册的账户名称和密码,请替换为实际注册的值。

点击发送 按钮后,可以在 HTTP 响应 中看到返回的 Token 值

原文地址:https://www.cnblogs.com/mahidol/p/9367598.html

时间: 2024-10-11 01:15:49

在 Ubuntu 16.04 上的 ASP.NET Core 应用开发04:使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器的相关文章

使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(二)

在 使用 ASP.NET Core Identity 的 IdentityServer4 授权服务器(1) 中,IdentityServer4 使用的是内存数据,不方便灵活,这次要把 IdentityServer4 的数据也保存到数据库中. 添加 IdentityServer4.EntityFramework IdentityServer4 有两种类型的数据需要保存数据库中.第一是配置数据(资源和客户端).第二个是 IdentityServer 在使用时产生的操作数据(令牌,代码和同意).这些存

Ubuntu 16.04配置OpenCV 3.1.0

我们都知道,OpenCV是基于C++的开源计算机视觉库,但是从2.4.4版本开始提供了Java绑定,也就是说,我们也可以使用Java来开发基于OpenCV的计算机视觉应用.目前,最新的版本是3.1.0,在本文中将会介绍如何中Ubuntu 16.04上搭建OpenCV for Java的开发环境,假设目前使用的是刚刚重装的Linux操作系统. ipp_file=../ippicv_linux_20151201.tgz && ipp_hash=$(md5sum $ipp_file | cut

ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

转自:http://www.cnblogs.com/mzwhj/p/3592895.html 上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东西没有理由不支持. 附件的上传同样基于KindEditor实现,可以上传图片,flash,影音,文件等. 目录 ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一)

ASP.NET MVC 过滤器开发与使用

文章来源:http://www.cnblogs.com/JinvidLiang/p/4660200.html(感谢) ASP.NET MVC 过滤器开发与使用 ASP.NET MVC 中给我们提供了内置的过滤器,通过过滤器,我们可以在控制器内的方法前后,添加必须的业务逻辑,如权限验证,身份验证,错误处理等. 今天,我们主要介绍3个过滤器:OutputCacheAttribute,AuthorizeAttribute,HandleErrorAttribute. 我们会根据这三个内置过滤器,分别举不

使用 Nginx 在 Ubuntu 16.04 上托管 ASP.NET Core

使用 Nginx 在 Ubuntu 16.04 上托管 ASP.NET Core 准备工作 服务器主机:腾讯云主机 Ubuntu 16.04 64位 客户端软件:putty.exe; WinSCP 5.13.2 在 Ubuntu 中安装 ASP.NET Core 微软在 .NET Core指南 提供了在不同操作系统中安装运行 ASP.NET Core 的帮助文档,请选择 linux-prerequisites 部分,并找到和自己服务器所安装操作系统相同的内容进行安装即可. 注册Microsoft

我的淘宝:Ubuntu 16.04.2上安装 Oracle 11.2.0.4 RAC

进入淘宝店铺 教程:Ubuntu 16.04.2上安装 Oracle 11.2.0.4 RAC 请支持下.价格好商量!

解决Ubuntu 16.04 上Android Studio2.3上面运行APP时提示DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs的问题

本人工作环境:Ubuntu 16.04 LTS + Android Studio 2.3 AVD启动之后,运行APP,报错提示: DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs 搜索后发现这是因为未关闭android studio上的instant app所致. File->settings->Buil,Execution,Deployment->Instant Run->Disable it. 详情请参看以下sta

如何在 Ubuntu Linux 16.04上安装开源的 Discourse 论坛

Discourse 是一个开源的论坛,它可以以邮件列表.聊天室或者论坛等多种形式工作.它是一个广受欢迎的现代的论坛工具.在服务端,它使用 Ruby on Rails 和 Postgres 搭建, 并且使用 Redis 缓存来减少读取时间 , 在客户端,它使用支持 Java Script 的浏览器.它非常容易定制,结构良好,并且它提供了转换插件,可以对你现存的论坛.公告板进行转换,例如: vBulletin.phpBB.Drupal.SMF 等等.在这篇文章中,我们将学习在 Ubuntu 操作系统

在 Ubuntu 16.04 上安装 LEMP 环境之图文向导

导读 LEMP 是个缩写,代表一组软件包(注解 ① L:Linux OS,E:Nginx 网络服务器,M:MySQL/MariaDB 数据库和 P:PHP 服务端动态编程语言),它被用来搭建动态的网络应用和网页.这篇教程会教你怎么在 Ubuntu 16.04 的服务器上安装 LEMP (Nginx 和 MariaDB 以及 PHP7). 步骤 1:安装 Nginx 服务器 在 Ubuntu 16.04 安装 Nginx Nginx 是一个先进的.资源优化的 Web 服务器程序,用来向因特网上的访