当前位置: 首页 > 知识库问答 >
问题:

ASP。NET Core使用Azure Active Directory进行身份验证,并跨请求保留自定义声明

贝滨海
2023-03-14

我在Visual Studio 2017中创建了一个默认的ASP. NET Core网站。我选择使用Azure Active Directory进行身份验证。我运行该网站,可以使用Active Directory中的帐户成功登录。

我可以检索由Active Directory提供的索赔信息,例如,通过调用以下行,我获得了名称。

User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;

我想为登录用户添加一个自定义声明-CompanyId=123456。我可以添加自定义声明,但它仅在设置声明的页面上可用。

Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
((ClaimsIdentity)User.Identity).AddClaim(claim);

我的理解是,我需要以某种方式更新由Active Directory发布的令牌,或者在令牌发布之前设置声明。我不知道怎么做。

我怀疑这需要在SignIn()的AccountController中完成

// GET: /Account/SignIn
[HttpGet]
public IActionResult SignIn()
{
    return Challenge(
            new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectDefaults.AuthenticationScheme);
}

我已经阅读了很多关于这个场景的文章和示例(包括https://github.com/ahelland/AADGuide-CodeSamples/tree/master/ClaimsWebApp)但是,我们还没有解决如何跨请求持久化声明的问题。

我已经成功地使用ASP. NET身份作为身份验证提供程序来持久化自定义声明,但这似乎是因为自定义声明被保存到数据库中。.

共有2个答案

丌官承
2023-03-14

对于那些想了解更多细节的人,提供的代码将放在Startup中。反恐精英

在配置方法中添加/编辑:

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
    {
        OnTokenValidated = TokenValidated
    }
});

私有任务令牌验证方法位于Startup.cs

下面的示例是一个很好的参考。https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-aspnetcore-v2/blob/master/WebApp-OpenIDConnect-DotNet/Startup.cs

林德辉
2023-03-14

OnTokenValidated为您提供了修改从传入令牌获得的ClaimsIdentity的机会,以下代码供您参考:

private Task TokenValidated(TokenValidatedContext context)
{
    Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
    (context.Ticket.Principal.Identity as ClaimsIdentity).AddClaim(claim);

    return Task.FromResult(0);
}

设置OpenIdConnectEvents:

Events = new OpenIdConnectEvents
{
    OnRemoteFailure = OnAuthenticationFailed,
    OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,

    OnTokenValidated = TokenValidated
}

然后在控制器中使用:

var companyId=  User.Claims.FirstOrDefault(c => c.Type == "CompanyId")?.Value;
 类似资料:
  • 在过去的几周里,我一直在努力掌握KeyClope,这样我就可以实现一种使用遗留提供商(基于Oracle,带有会话表和各种奇怪的东西)对用户进行身份验证的方法。我们计划在不久的将来解决这个问题,但目前我们必须解决这个问题,所以我们的想法是在前线使用KeyClope——利用它提供的主要好处,比如SSO——在需要身份验证的应用程序中省略传统的身份验证提供程序。 我读了一些关于构建自定义OIDC身份提供程

  • 我需要保护我的spring boot应用程序,这是我所拥有的: null 我知道spring boot的web安全特性,但是没有足够的信息来说明如何与自定义令牌一起使用这些特性。

  • 我使用的是spring security 3.1.3。在我正在开发的应用程序中,当用户尝试登录时,除了检查用户名和密码外,我还需要进行额外的检查以验证他们的帐户(特别是,他们的帐户没有一个标志集,表明他们被禁止登录)。我不知道最好的办法是什么。 我应该创建一个身份验证过滤器bean,并将其包含在SpringXML中的表单登录元素中吗?或者,我应该使用仅在用户成功满足用户名/密码要求时才运行的身份验

  • 我试图使用keycloak只用于身份验证,并有自己的自定义过滤器用于授权。因此理想的流程是:首先,Keycloak filter对请求进行身份验证,并在上下文中设置身份验证对象。然后,我的自定义过滤器应该运行,它应该获得现有的身份验证对象,在该身份验证对象中添加权限,并将其设置回上下文中。 因此,首先,在speing引导应用程序中使用keycloak是正确的方法吗?如果是,那么如何使我的过滤器在过

  • 我试图在一个反应式Spring Boot应用程序中配置一个Spring Security性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建用户名密码身份验证令牌(身份验证),并手动进行身份验证。 但是,在执行此操作时,应用程序似乎无

  • 当使用Firebase Auth进行身份验证时,我想自动输入通过SMS接收的代码。我能够接收短信并手动完成身份验证过程,但当我使用SmsRetriever时,应用程序崩溃,然后显示底部工作表对话框。这是Logcat中显示的所有内容: [SmsRetrieverHelper]SMS校验码请求失败:未知状态代码:17010 null 用户输入其电话号码的代码片段: 这是片段中的代码,用户必须在其中输入