gpt4 book ai didi

c# - 如果 OIDC 提供的用户在数据库中不可用,.NET 如何不进行身份验证

转载 作者:行者123 更新时间:2023-12-03 19:19:39 24 4
gpt4 key购买 nike

因此,我的 .NET Core WebApplication 正在通过 Azure AD 登录用户,并且我有一个包含用户及其角色的数据库。

我已经创建了 OIDC 中间件,以从我的数据库中为尝试登录的用户添加声明。

所以流程是:

  • 我使用我的 AD 帐户登录
  • 我得到电子邮件地址并在数据库中检查它的角色
  • 现在,如果用户被阻止或未分配,登录应该失败

  • 所以我的问题是:当他在数据库中不可用或被阻止时,有没有办法拒绝对用户的身份验证?

    我现在所做的是我设置了一个声明,如果该声明不可用,它将被重定向到访问被拒绝页面(通过使用 AuthorizationPolicy),但我希望用户将被重定向到 Microsoft/AD 的登录页面(最好有一条消息)。

    这是否可能以某种方式,如果是这样,如何?

    这是我现在的代码:
     services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
    .AddAzureAD(options => { Configuration.Bind("AzureAd", options); }
    );

    services.AddControllersWithViews(options =>
    {
    var policy = new AuthorizationPolicyBuilder()
    .RequireAuthenticatedUser()
    .RequireAssertion(context =>
    {
    Claim claim = context.User.Claims.First(claim => claim.Type == ClaimTypes.Expired);
    return context.User.HasClaim(x => x.Type == ClaimTypes.Expired) &&
    context.User.Claims.First(claim => claim.Type == ClaimTypes.Expired).Value
    .Equals("false", StringComparison.OrdinalIgnoreCase);
    })
    .RequireClaim(ClaimTypes.Name)
    .RequireClaim(ClaimTypes.Role)
    .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
    });

    // OIDC Middleware, to access the User's Claims while logging in through AzureAD
    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
    options.Events = new OpenIdConnectEvents
    {
    OnRemoteFailure = ctx =>
    {
    ctx.Response.Redirect("/");
    ctx.HandleResponse();
    return Task.CompletedTask;
    },
    OnSignedOutCallbackRedirect = ctx =>
    {
    ctx.Response.Redirect("/");
    ctx.HandleResponse();
    return Task.CompletedTask;
    },
    OnTokenValidated = ctx =>
    {
    // Get the user's email
    var email = ctx.Principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name)?.Value;

    // Query the database to get the role
    using (var db = ctx.HttpContext.RequestServices.GetRequiredService<TracingContext>())
    {
    // Get the Users from the database, with the logged in email address (from Azure)
    User user = db.Users.FirstOrDefault(u => u.UPN.Equals(email));

    if (user != null)
    {
    user.LastLogin = DateTime.Now;
    db.SaveChanges();

    // Add claims
    var claims = new List<Claim>
    {
    new Claim(ClaimTypes.Role, user.Role.ToString()),
    new Claim(ClaimTypes.Expired, (!user.IsActivated || user.IsBlocked).ToString())
    };

    // Save the claim
    var appIdentity = new ClaimsIdentity(claims);
    ctx.Principal.AddIdentity(appIdentity);
    }
    else
    {
    **// Send back to Login Page (with error message, maybe?)**
    }
    }
    return Task.CompletedTask;
    },
    };
    });

    最佳答案

    您可以覆盖默认处理并自己处理响应:

    // Send back to Login Page (with error message, maybe?)
    ctx.HandleResponse();
    ctx.Response.Redirect("/path/to/login");

    HandleResponse 的调用表明我们想要自己处理响应,接下来的调用设置重定向。有几种方法可以发送错误消息。一种方法是为登录 URL 提供查询字符串参数。

    关于c# - 如果 OIDC 提供的用户在数据库中不可用,.NET 如何不进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59612081/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com