第32章 事件 - Identity Server 4 中文文档(v1.0.0)
日志记录是更低级别的“printf”样式 - 事件代表有关IdentityServer中某些操作的更高级别信息。事件是结构化数据,包括事件ID,成功/失败信息,类别和详细信息。这使得查询和分析它们变得容易,并提取可用于进一步处理的有用信息。
32.1 发出事件
默认情况下不会启用事件 - 但可以在ConfigureServices
方法中进行全局配置,例如:
services.AddIdentityServer(options =>
{
options.Events.RaiseSuccessEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseErrorEvents = true;
});
要发出事件,请使用IEventService
DI容器并调用RaiseAsync
方法,例如:
public async Task<IActionResult> Login(LoginInputModel model)
{
if (_users.ValidateCredentials(model.Username, model.Password))
{
// issue authentication cookie with subject ID and username
var user = _users.FindByUsername(model.Username);
await _events.RaiseAsync(new UserLoginSuccessEvent(user.Username, user.SubjectId, user.Username));
}
else
{
await _events.RaiseAsync(new UserLoginFailureEvent(model.Username, "invalid credentials"));
}
}
32.2 自定义接收器
我们的默认事件接收器只是将事件类序列化为JSON并将其转发到ASP.NET Core日志系统。如果要连接到自定义事件存储,请实现该IEventSink
接口并将其注册到DI。
以下示例使用Seq发出事件:
public class SeqEventSink : IEventSink
{
private readonly Logger _log;
public SeqEventSink()
{
_log = new LoggerConfiguration()
.WriteTo.Seq("http://localhost:5341")
.CreateLogger();
}
public Task PersistAsync(Event evt)
{
if (evt.EventType == EventTypes.Success ||
evt.EventType == EventTypes.Information)
{
_log.Information("{Name} ({Id}), Details: {@details}",
evt.Name,
evt.Id,
evt);
}
else
{
_log.Error("{Name} ({Id}), Details: {@details}",
evt.Name,
evt.Id,
evt);
}
return Task.CompletedTask;
}
}
将Serilog.Sinks.Seq
包添加到主机以使上述代码有效。
32.3 内置事件
IdentityServer中定义了以下事件:
ApiAuthenticationFailureEvent
&ApiAuthenticationSuccessEvent
获取内省端点上的成功/失败API身份验证。ClientAuthenticationSuccessEvent
&ClientAuthenticationFailureEvent
获取在令牌端点处成功/失败的客户端身份验证。TokenIssuedSuccessEvent
&TokenIssuedFailureEvent
获取成功/失败尝试请求身份令牌,访问令牌,刷新令牌和授权码。TokenIntrospectionSuccessEvent
&TokenIntrospectionFailureEvent
获取成功的令牌内省请求。TokenRevokedSuccessEvent
获取成功的令牌吊销请求。UserLoginSuccessEvent & UserLoginFailureEvent
成功/失败用户登录的快速入门UI引发。UserLogoutSuccessEvent
获取成功的注销请求。ConsentGrantedEvent
&ConsentDeniedEvent
在同意UI中引发。UnhandledExceptionEvent
获取未处理的异常。DeviceAuthorizationFailureEvent
&DeviceAuthorizationSuccessEvent
获取成功/失败的设备授权请求。
32.4 自定义事件
您可以创建自己的事件并通过我们的基础架构发出它们。
您需要从我们的基Event
类派生,该基类注入活动ID,时间戳等上下文信息。您的派生类可以添加特定于事件上下文的任意数据字段:
public class UserLoginFailureEvent : Event
{
public UserLoginFailureEvent(string username, string error)
: base(EventCategories.Authentication,
"User Login Failure",
EventTypes.Failure,
EventIds.UserLoginFailure,
error)
{
Username = username;
}
public string Username { get; set; }
}
第32章 事件 - Identity Server 4 中文文档(v1.0.0)的更多相关文章
- 第18章 启动 - Identity Server 4 中文文档(v1.0.0)
IdentityServer是中间件和服务的组合.所有配置都在您的启动类中完成. 18.1 配置服务 您可以通过调用以下方法将IdentityServer服务添加到DI系统: public void ...
- 第66章 视频 - Identity Server 4 中文文档(v1.0.0)
第66章 视频 66.1 2019 January [NDC] - 使用ASP.NET Core 2.2和3.0保护Web应用程序和API 1月[NDC] - 为基于OpenID Connect / ...
- 第41章 CORS - Identity Server 4 中文文档(v1.0.0)
第41章 CORS IdentityServer中的许多端点将通过基于JavaScript的客户端的Ajax调用进行访问.鉴于IdentityServer最有可能托管在与这些客户端不同的源上,这意味着 ...
- 第21章 登录 - Identity Server 4 中文文档(v1.0.0)
为了使IdentityServer能够代表用户发出令牌,该用户必须登录IdentityServer. 21.1 Cookie身份验证 使用由ASP.NET Core中的cookie身份验证处理程序管理 ...
- 第2章 术语 - Identity Server 4 中文文档(v1.0.0)
规范.文档和对象模型等都使用特定的术语来表述. 2.1 IdentityServer IdentityServer是OpenID Connect提供程序 - 它实现OpenID Connect和OAu ...
- 第64章 学习 - Identity Server 4 中文文档(v1.0.0)
以下是一些在线,远程和课堂培训选项,以了解有关ASP.NET Core Identity和IdentityServer4的更多信息. 64.1 现代应用程序的身份和访问控制(使用ASP.NET Cor ...
- 第56章 Client - Identity Server 4 中文文档(v1.0.0)
该Client模型的OpenID Connect或OAuth 2.0 客户端-例如,本地应用,Web应用程序或基于JS的应用程序. 56.1 Basics Enabled 指定是否启用客户端.默认为t ...
- 第57章 GrantValidationResult - Identity Server 4 中文文档(v1.0.0)
该GrantValidationResult类模型补助确认为扩展授权和资源所有者密码授权的结果. 最常见的用法是使用身份验证(成功用例): context.Result = new GrantVali ...
- 第45章 工具 - Identity Server 4 中文文档(v1.0.0)
该IdentityServerTools是为IdentityServer编写扩展代码时,你可能需要有效的内部工具的集合.要使用它,请将其注入代码,例如控制器: public MyController( ...
随机推荐
- over(partition by..) 的运用(转)
oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每 ...
- vue的风格指南(强烈推荐)
1.组件文件 只要有能够拼接文件的构建系统,就把每个组件单独分成文件. 当你需要编辑一个组件或查阅一个组件的用法时,可以更快速的找到它. 2.单文件组件文件的大小写 单文件组件的文件名应该要么始终是单 ...
- C# CreateParams的使用(解决闪屏问题)
<转载自:https://blog.csdn.net/xpwang/article/details/53427479> 窗体和控件的属性CreateParams(这真的是一个属性)很神奇, ...
- class A<T> where T:new()
class A<T> where T:new() 这是类型参数约束,where表明了对类型变量T的约束关系.where T:A 表示类型变量是继承于A的,或者是A本身.where T: n ...
- jsp中input获得后台传递的值
1.后台赋值 req.setAttribute("openId",openId); 2.前台获取值 value="<%= request.getAttribute( ...
- HTML标签 按功能排序
按功能类别排列 New : HTML5 中的新标签. 基础 标签 描述 <!DOCTYPE> 定义文档类型. <html> 定义 HTML 文档. <title> ...
- Java运行原理及内存分析
Java运行原理及内存分析 一.Java运行原理 二.Java内存分析
- Tomcat相关面试题,看这篇就够了!保证能让面试官颤抖!
Tomcat相关的面试题出场的几率并不高,正式因为如此,很多人忽略了对Tomcat相关技能的掌握. 这次整理了Tomcat相关的系统架构,介绍了Server.Service.Connector.Con ...
- [CERC2017] Intrinsic Interval
首先理清这奇葩题意表述 给出一个\(1\)到\(n\)的排列\(p[]\)和\(m\)次询问,每次询问覆盖区间\([l,r]\)的最小区间\([a,b]\),满足\([a,b]\)内的元素排序后是连续 ...
- Python内置函数(20)——exec
英文文档: exec(object[, globals[, locals]]) This function supports dynamic execution of Python code. obj ...