IdentityServer4入门四:应用Implicit模式保护网站(下)
为认证服务端增加数据库支持
我计划使用一个名为Admin的表,放在一个已有的数据库里。所以我需要定义Admin类和在配置里预先加上数据库连接
新增类:Admin.cs
public class Admin
{
public int Id { get; set; }
public DateTime CreateDate { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string Remark { get; set; }
}
配置上加上将要使用AdminContext的连接串,打开appsettings.json,添加红圈部分。可以按自己的数据库连接修改连接串。也可以不做这一部分,后面的过程IDE也会自己加上

在IdentityMvc项目的Controlers目录右键,选择“添加”=》“新搭建基架的项目”

选择“其操作使用Entity...的API控制器”

按“+”,添加数据上下文,修改图上的,添加后,修改控制器的名称为“AccountControler"

“添加”后,框架会修改startup.cs,添加几个文件。你可以自己看看修改的内容,弄明白Entity的一些机制。如果数据库没有这个表,我们可以进行以下操作,让框架帮我们去创建
点击菜单:工具=》NuGet包管理器=》程序包管理器控制台
Add-Migration CreateIdentitySchema
Update-Database
Add-Migration命令的 "CreateIdentitySchema" 名称参数是任意的

执行完上面的两个命令后,数据库访问就准备好了。现在要去修改AccountController,现在框架为我们生成的AccountCountroller并不是我们需要的,我们要整个替换掉
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using IdentityMvc.Data;
using IdentityServer4.Services;
using IdentityServer4.Stores;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore; namespace IdentityMvc.Controllers
{
public class AccountController : Controller
{
private readonly AdminContext _dbAdmin;
private readonly IIdentityServerInteractionService _interaction;
private readonly IClientStore _clientStore;
private readonly IAuthenticationSchemeProvider _schemeProvider;
private readonly IEventService _events;
public AccountController(IIdentityServerInteractionService interaction,
IClientStore clientStore,
IAuthenticationSchemeProvider schemeProvider,
IEventService events,
AdminContext db)
{
_interaction = interaction;
_clientStore = clientStore;
_schemeProvider = schemeProvider;
_events = events;
_dbAdmin = db;
} /// <summary>
/// 登录页面
/// </summary>
[HttpGet]
public async Task<IActionResult> Login(string returnUrl = null)
{
ViewData["returnUrl"] = returnUrl;
return View();
} /// <summary>
/// 登录post回发处理
/// </summary>
[HttpPost]
public async Task<IActionResult> Login(string userName, string password, string returnUrl = null)
{ ViewData["returnUrl"] = returnUrl;
Admin user = await GetByStr(userName, password);
if (user != null)
{
AuthenticationProperties props = new AuthenticationProperties
{
IsPersistent = true,
ExpiresUtc = DateTimeOffset.UtcNow.Add(TimeSpan.FromDays(1))
};
await HttpContext.SignInAsync(user.Id.ToString(), user.UserName, props);
if (returnUrl != null)
{
return Redirect(returnUrl);
} return View();
}
else
{
return View();
}
} /// <summary>
/// 验证用户,成功则返回用户信息,否则返回null
/// </summary>
/// <param name="username"></param>
/// <param name="pwd"></param>
/// <returns></returns>
public async Task<Admin> GetByStr(string username, string pwd)
{
Admin m = await _dbAdmin.Admin.Where(a => a.UserName == username && a.Password == pwd).SingleOrDefaultAsync();
if (m != null)
{
return m;
}
else
{
return null;
}
}
}
}
如果你对于为什么Controller的构造函数放这么多参数,也希望看看哪里构造这个AccountController.其实是asp.net core的DI处理的,可以看看这文章
https://www.cnblogs.com/jesse2013/p/di-in-aspnetcore.html
好了,准备一下我们的Login视图就可测试了
在View目录下新增”Account"目录,右键Account目录,“添加”=》“视图”,录入Login名称,IDE将新建Login.cshtml,将其内容替换为如下代码:
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Login</title>
</head>
<body>
<div align="center">
<h1>统一认证登录中心</h1>
<form action="/Account/Login" method="post">
用户名:<input type="text" name="userName" /><br />
密 码:<input type="password" name="password" /><input type="hidden" name="returnUrl" value="@ViewData["returnUrl"]" /> <br />
<input type="submit" value="登录" />
</form>
</div>
</body>
</html>
如果你都没有忽略什么的话,你应能在登录后看到界面回到首页下

但,如何你看到的是一个空白的页面,地址类似于https://localhost:44302/signin-oidc的页面,就说明,客户端ClientMvc的startup.cs文件的Configure方法少了一句:

IdentityServer4入门四:应用Implicit模式保护网站(下)的更多相关文章
- IdentityServer4入门四:应用Implicit模式保护网站(上)
我们先新增一个网站,名为“ClientMvc",也是asp.net core Web应用程序(模型视图控制器) 使用nuget安装以下引用 Microsoft.AspNetCore.Auth ...
- IdentityServer4入门三:授权模式
在入门一.入门二我们实现了一个完整的API保护的过程.需要保护的API只需在其Controler上应用[Authorize]特性,来显式指定受保护的资源.而我们实现的这个例子,所应用的模式叫“Clie ...
- Java设计模式从精通到入门四 工厂方法模式
工厂方法模式 属于23中设计模式中创建型类型. 核心思想:工厂提供创建对象的接口,由子类决定实例化哪一个子类. 来源 设计模式之禅中的例子,女娲造人,通过八卦炉来进行造人,没有烧熟的为白人,烧太熟 ...
- IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API
IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API 原文:http://docs.identityserver.io/en/release/quickstarts/ ...
- 解析汽车B2C商城网站四种盈利模式
汽车已成为家庭的日常用品,汽车的配套设施也成为销售的热点,汽车B2C电子商城为行业营销的新平台,汽车B2C电子商务网站盈利的模式是怎样的?创新的盈利模式才能在行业竞争中生存. 资讯产品一体模式 网站的 ...
- 微服务(入门四):identityServer的简单使用(客户端授权)
IdentityServer简介(摘自Identity官网) IdentityServer是将符合规范的OpenID Connect和OAuth 2.0端点添加到任意ASP.NET核心应用程序的中间件 ...
- IdentityServer4 实现自定义 GrantType 授权模式
OAuth 2.0 默认四种授权模式(GrantType): 授权码模式(authorization_code) 简化模式(implicit) 密码模式(password) 客户端模式(client_ ...
- 从Client应用场景介绍IdentityServer4(四)
原文:从Client应用场景介绍IdentityServer4(四) 上节以对话形式,大概说了几种客户端授权模式的原理,这节重点介绍Hybrid模式在MVC下的使用.且为实现IdentityServe ...
- 爬虫入门四 re
title: 爬虫入门四 re date: 2020-03-14 16:49:00 categories: python tags: crawler 正则表达式与re库 1 正则表达式简介 编译原理学 ...
随机推荐
- jQuery的显示和隐藏
在 jQuery 中可以使用 hide() 和 show() 方法来隐藏和显示 HTML 元素,以及使用 toggle() 方法能够切换 hide() 和 show() 方法. 隐藏例子: <! ...
- js同时获取多个共同class内容标签内容集合
1.获取标签内容 标签如下: <img image-code="#qq_1_gif#" class="emoji_icon" src="i ...
- 本地数据存储解决方案以及cookie的坑
本地数据存储解决方案以及cookie的坑 问题: cookie过长导致页面打开失败 背景: 在公司的项目中有一个需求是打开多个工单即在同一个页面中打开了多个tab(iframe),但是需要在刷新时只刷 ...
- English-培训1-Phonetic symbols
- LA服务可用性4个9是什么意思?怎么达到?
SLA:服务等级协议(简称:SLA,全称:service level agreement).是在一定开销下为保障服务的性能和可用性,服务提供商与用户间定义的一种双方认可的协定.通常这个开销是驱动提供服 ...
- Flutter——AlertDialog组件、SimpleDialog组件、showModalBottomSheet组件(弹窗组件)
AlertDialog组件 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( title: " ...
- [Python]pip install offline 如何离线pip安装包
痛点:目标机器无法连接公网,但是能使用rz.sz传输文件 思路:在能上网的机器是使用pip下载相关依赖包,然后传输至目标机器,进行安装 0. Install pip: http://pip-cn.re ...
- Windows10安装MongoDB4.0详细流程及启动配置
一.安装 首先去官网下载Mongodb安装包,网址https://www.mongodb.com/download-center/community,下载完成后双击安装就行 安装步骤: 1.点击nex ...
- 检查shell脚本
1.检查solr服务监控脚本: #/bin/bash starttime=$(date +%Y-%m-%d\ %H:%M:%S) http_code=$(curl -I -m -o /dev//sol ...
- 重新编程Hexiwear Docking Station扩展坞
Hexiwear扩展坞(Docking Station)有一个很不错的功能:它板载了一个调试电路(OpenSDA). 这样我就不需要一个外部调试器来调试Hexiwear. 但是,重新编程扩展坞自身需要 ...