You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor .Net 5使用MS Identity Platform登录后执行自定义方法及拦截方案

实现方案

1. 登录成功后执行自定义后置逻辑

你要的MyCustomPostSignInLogic可以通过OpenID Connect的OnTokenValidated事件触发,这个事件会在Azure AD侧验证完成、.NET侧拿到有效令牌后、正式建立本地会话前执行,完全匹配你需要的时机。
配置方法如下(在Startup.cs的ConfigureServices方法中修改身份验证配置即可):

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddInMemoryTokenCaches()
    .AddOpenIdConnectEvents(options => 
    {
        options.Events.OnTokenValidated = async context =>
        {
            // 此处可以拿到当前登录用户的所有身份信息,包括Claims、令牌等
            var userClaims = context.Principal.Claims;
            // 执行你的自定义后置逻辑
            MyCustomPostSignInLogic();
            await Task.CompletedTask;
        };
    });

2. 拦截登录流程实现自定义校验

要实现哪怕Azure AD验证通过也可以拒绝登录的需求,同样在上述OnTokenValidated事件中处理即可,你可以调用MyCustomOverrideSignInLogic判断是否允许登录,不符合条件直接终止流程:

options.Events.OnTokenValidated = async context =>
{
    // 先执行自定义校验逻辑
    bool allowSignIn = MyCustomOverrideSignInLogic(context.Principal);
    if (!allowSignIn)
    {
        // 终止登录流程,返回错误信息
        context.Fail("您的账号无权限访问本系统");
        return;
    }
    // 校验通过后再执行后置逻辑
    MyCustomPostSignInLogic();
    await Task.CompletedTask;
};

如果你的校验逻辑需要依赖注入的服务(比如查询黑名单的数据库上下文),可以通过context.HttpContext.RequestServices获取对应服务实例:

var userService = context.HttpContext.RequestServices.GetRequiredService<IUserService>();
bool isInBlackList = await userService.CheckBlackList(context.Principal.FindFirstValue(ClaimTypes.Upn));

如果需要在用户每次访问时都做校验(而非仅登录时校验一次),可以额外实现IClaimsTransformation接口,每次身份加载时都会自动执行你的校验逻辑。

内容的提问来源于stack exchange,提问作者user3280560

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:18:02