在使用Azure Active Directory对用户进行身份验证后执行代码

时间:2017-02-24 22:54:13

标签: c# azure active-directory asp.net-core-mvc

我使用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>

提前致谢。

1 个答案:

答案 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