我使用VS2015创建了一个ASP.NET MVC Core(1.1.0)应用程序。在对话框中,我选择了连接到Azure AD的选项,因此VS生成了样板代码,并且正如预期的那样,应用程序将我重定向到Microsoft的登录页面,在那里我可以使用我的工作和学校帐户登录。
现在,在用户登录之后,在服务第一页(比如/ home / index)之前,我需要从用户那里获得一些我存储在数据库中的信息(比如显示名称,联系信息)例如电子邮件,电话号码,地址,用户的图片等。
到目前为止,我所想到的是添加一个ControllerBase,其中包含一个检索此信息的方法,然后通过ViewData将其传递给视图。但是一遍又一遍地查询数据库中的这些信息似乎效率低下。另一种方法是将此信息存储在cookie或会话状态中,因此只能访问数据库一次。但是不得不依赖于ControllerBase可能会导致错误(例如,如果在某些控制器方法中忘记调用base的方法)并且感觉不太好。此外,如果用户输入具有预定义路径的URL(如在www.myapp.com/Users/joedoe/Detail中),则仅在主控制器上具有此功能可能会失败。
我搜索并找到了在Startup类中传递给应用程序构建器的OpenIdConnectOptions对象中使用Events属性的引用:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = Configuration["Authentication:AzureAd:ClientId"],
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"],
Events = new OpenIdConnectEvents {
//
}
});
但是,OpenIdConnectEvents类没有一些“OnAuthenticationSucceeded”事件,它只有OnAuthenticationFailed,这不是我想要的,以及其名称似乎不是我正在寻找的其他回调。
所以,我的问题是,我应该在OpenIdConnectEvents中使用什么回调,或者,在用户通过身份验证后连接到AAD以捕获事件的ASP.NET MVC Core应用程序的首选方式是什么?< / p>
提前致谢。
答案 0 :(得分:1)
您可以加入各种各样的OpenIdConnectEvents
。看SecurityTokenValidated
。在用户向AAD进行身份验证并且已验证令牌后,将触发此消息。在这里,您可以在数据库中查找数据,并将自己的声明添加到身份(如角色等)。
此示例将从AAD解析组名称,但概念是相同的 - 向声明集添加其他数据,您可以通过整个应用程序中的用户主体访问它。使用RoleType of role将允许您使用ASP.net中的现有属性(如Authorize(Role=...)
属性。
https://github.com/jpda/azure-ad-netcore-sample/blob/master/src/azure-ad-netcore-sample/Startup.cs