簡體   English   中英

ASP.NET Core使用Azure Active Directory進行身份驗證,並跨請求保留自定義聲明

[英]ASP.NET Core authenticating with Azure Active Directory and persisting custom Claims across requests

我在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標識作為身份驗證提供程序來保留自定義聲明,但這似乎是因為自定義聲明已保存到數據庫中。

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;

對於那些想要更多細節的人,提供的代碼放在Startup.cs中

在Configure方法中添加/編輯:

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

私有Task TokenValidated方法位於Startup.cs的主體中

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM