在默认的 Razor 页面应用中 Asp.Net 核心 2.0 Azure 广告身份验证



>使用VS 2017默认模板创建的Web应用程序具有以下Startup.ConfigureServices方法:

public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.AddRazorPagesOptions(options =>
{
options.Conventions.AllowAnonymousToFolder("/Account");
});
}

因此,授权过滤器是全局应用的,即使对于索引主页也是如此(例外是/Account/AccessDeny 和/Account/SignedOut 页面,它们在上面的代码中应用 [AllowAnonymous]。这意味着,当应用程序启动时,它会立即转到登录页面Microsoft这对我的情况来说很好。

帐户控制器具有以下代码:

[Route("[controller]/[action]")]
public class AccountController : Controller
{
[HttpGet]
public IActionResult SignIn()
{
var redirectUrl = Url.Page("/Index");
return Challenge(
new AuthenticationProperties { RedirectUri = redirectUrl },
OpenIdConnectDefaults.AuthenticationScheme
);
}
[HttpGet]
public IActionResult SignOut()
{
var callbackUrl = Url.Page("/Account/SignedOut", pageHandler: null, values: null, protocol: Request.Scheme);
return SignOut(
new AuthenticationProperties { RedirectUri = callbackUrl },
CookieAuthenticationDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme
);
}
}

在这里,AccountController.Signin 将隐式应用 [Authorize],因为 Authorization 筛选器全局应用。显然,除非用户首先注销并显式请求 url,否则代码不会运行/account/signin。但即使在这种情况下,首先要发生的是隐式 [Authorize] 筛选器,并且代码仅在用户成功登录后运行。所以,问题是,返回ChallengeResult有什么意义,因为用户应该在那个时候已经过身份验证?也许,只是重定向到如下所示的索引页面?

[HttpGet]
public IActionResult SignIn()
{
return RedirectToPage("/Index");
}

或者,如下所示,为什么不将 [AllowAnonymous] 应用于 AccountController.SignIn,以便在用户请求 url 时立即运行/account/signin

[HttpGet]
[AllowAnonymous]
public IActionResult SignIn()
{
var redirectUrl = Url.Page("/Index");
return Challenge(
new AuthenticationProperties { RedirectUri = redirectUrl },
OpenIdConnectDefaults.AuthenticationScheme
);
}

还有一个问题。我想在用户登录后立即执行一些代码。如果 AccountController.SignIn 不会运行,除非明确请求,否则将该代码放在哪里?默认模板创建了另一个类,称为 AzureAdAuthenticationBuilderExtensions。我是否应该挂接到该类中的 OpenId 事件并将我的代码放在这些事件处理程序中?

用户在注销后会看到登录链接的一种情况。 从某种意义上说,重定向到索引页面的效果与您案例中的质询相同。 您的AccountController应该[AllowAnonymous],否则它实际上没有意义。

要在登录后执行某些操作,您可以在OpenId Connect触发器上挂接到各种事件。OnTicketReceived事件可能适合您。 您可以查看 OpenIdConnectEvents 及其基类 RemoteAuthenticationEvents 上可用的所有事件。

最新更新