我有一个使用 Azure AD 登录用户的 asp.net 核心 Web 应用程序。由于某些用户经常共享计算机,因此他们可能无法登录/退出应用程序,这对于大多数操作来说都是可以的。但是,我现在需要强制用户在更新应用程序的某些区域(即输入临床信息)时重新输入密码。这是为了确保写入系统的敏感信息被标记在正确的用户名下,以用于审计目的。
为了测试此功能,我使用Microsoft 身份平台文档中的信息和示例创建了一个新的 asp.net core 5.0 Razor Web 应用程序。我遇到的问题是标准库(Microsoft.Identity.Web 和 Microsoft.Identity.Web.UI)似乎没有提供我能找到的这个功能。
我尝试在我的应用程序注册中添加 spa 重定向并使用 MSAL,但问题是在成功调用 loginPopup 并使用不同的用户帐户登录后,Razor 应用程序仍以旧用户身份进行身份验证。也许 Razor Web 应用程序不应与 SPA/MSAL 功能结合使用。
因此,我正在使用此处记录的方法。但是,我无法成功捕获对包含状态信息的 redirect_uri 的 POST 请求,因为服务器返回 302 响应并改为重定向到 /signin-oidc。在此之后,我指定的 redirect_uri 被加载,但作为 GET 请求,所以我的表单信息消失了。我需要此状态信息,以便我知道在成功完成重新身份验证后要执行什么操作。
如何使用带有 Microsoft.Identity.Web 库的 Razor Pages 或 MVC Web 应用程序重新进行身份验证?
应用程序代码
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"));
services.AddAuthorization(options =>
{
// By default, all incoming requests will be authorized according to the default policy
options.FallbackPolicy = options.DefaultPolicy;
});
services.AddRazorPages()
.AddMvcOptions(options => { })
.AddMicrosoftIdentityUI();
}
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
private readonly IConfiguration _configuration;
public IndexModel(ILogger<IndexModel> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
}
public string AuthURL { get; set; }
public void OnGet()
{
var nonce = Guid.NewGuid().ToString();
var redirectHost = $"{HttpContext.Request.Scheme}://{HttpContext.Request.Host}";
var redirectPath = "/Test";
var encodedURL = UriHelper.Encode(new Uri(redirectHost + redirectPath));
AuthURL = $"{_configuration["AzureAd:Instance"]}{_configuration["AzureAd:TenantId"]}/oauth2/v2.0/authorize?" +
$"client_id={_configuration["AzureAd:ClientId"]}" +
$"&redirect_uri={encodedURL}" +
"&response_type=id_token" +
"&response_mode=form_post" +
"&scope=openid" +
"&prompt=login" +
"&hsu=1" +
$"&login_hint={User.Identity.Name}" +
$"&state=my_state" +
$"&nonce={nonce}";
}
}
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
<a href="@Model.AuthURL" class="btn btn-outline-primary">ReAuth</a>