2017-02-24 154 views
0

我使用VS2015创建了ASP.NET MVC Core(1.1.0)应用程序。在对话框中,我选择了连接到Azure AD的选项,因此VS生成了样板代码,并且正如所料,该应用将我重定向到Microsoft的登录页面,在那里我可以使用我的工作&学校帐户登录。用户使用Azure Active Directory进行身份验证后执行代码

现在,用户登录后,服务第一页(比如/ home/index)之前,我需要从用户那里获得一些信息,这些信息是存储在数据库中的(例如显示名称,联系人诸如电子邮件,电话号码,地址,用户的照片等信息)。

我到目前为止的想法是添加一个ControllerBase与检索此信息的方法,然后通过ViewData将其传递给视图。但是反复查询数据库似乎效率不高。另一种方法是将此信息存储在cookie中或会话状态中,因此只能触击数据库一次。但是必须依赖ControllerBase可能会导致错误(例如,如果在某些控制器方法中,人们忘记调用基本方法)并且感觉不到他们想要的方式。此外,如果用户使用预定义路径输入URL(如www.myapp.com/Users/joedoe/Detail),则在家庭控制器上使用此功能可能会失败。

我搜查,发现使用的OpenIdConnectOptions的事件属性的参考对象传递到启动类的应用程序生成器:

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应用程序的首选方式是在用户通过身份验证后捕获事件?

在此先感谢。

回答

1

有各种各样的OpenIdConnectEvents你可以挂钩。看看SecurityTokenValidated。这会在用户通过AAD验证并且验证令牌后触发。在这里,您可以查找数据库中的数据并将自己的声明添加到身份(如角色等)。

本示例将解析AAD中的组名,但概念相同 - 将额外数据添加到声明集,并且您可以在整个应用程序中通过用户主体访问它。使用角色的ClaimType会让你使用ASP.net现有的属性(如Authorize(Role=...)属性。

https://github.com/jpda/azure-ad-netcore-sample/blob/master/src/azure-ad-netcore-sample/Startup.cs

+1

谢谢约翰!有回调机能的研究设置OnTokenValidated财产的伎俩,如你所说。提供的例子非常好,我打算使用会话状态,但声称看起来更好,就像你提供的例子一样。再次感谢。 –

相关问题