Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET核心使用Azure Active Directory进行身份验证,并跨请求持久化自定义声明_C#_Asp.net_Authentication_Azure Active Directory_Claims Based Identity - Fatal编程技术网

C# ASP.NET核心使用Azure Active Directory进行身份验证,并跨请求持久化自定义声明

C# ASP.NET核心使用Azure Active Directory进行身份验证,并跨请求持久化自定义声明,c#,asp.net,authentication,azure-active-directory,claims-based-identity,C#,Asp.net,Authentication,Azure Active Directory,Claims Based Identity,我在Visual Studio 2017中创建了一个默认的ASP.NET核心网站。我已选择使用Azure Active Directory进行身份验证。 我运行该站点,并可以使用Active Directory中的帐户成功登录 我可以检索Active Directory提供的索赔信息,例如,通过调用下面的行,我可以获得“名称” User.Claims.FirstOrDefault(c => c.Type == "name")?.Value; 我想为登录用户添加一个自定义声明-Compan

我在Visual Studio 2017中创建了一个默认的ASP.NET核心网站。我已选择使用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中完成

我已经阅读了很多关于这个场景的文章和示例(包括),但是还没有解决如何跨请求持久化声明的问题


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

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

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;

对于那些想了解更多细节的人,提供的代码放在Startup.cs中

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

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
    }
});
private Task TokenValidated方法位于Startup.cs的主体中

下面的示例是一个很好的参考。

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
    }
});