亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 IdentityServer4 從單個客戶端接受承載身份驗證和 OpenIdConnect

使用 IdentityServer4 從單個客戶端接受承載身份驗證和 OpenIdConnect

C#
泛舟湖上清波郎朗 2022-10-15 15:16:42
在對IdentityServer4 Quickstart 示例解決方案(特別是 8_AspNetIdentity 示例)進行一些調整后,我遇到了一些問題。我會先說我不確定我正在嘗試做的事情是否不受支持,或者我做錯了。此示例解決方案包含與我的問題相關的以下項目:一個身份服務器,一個使用 OpenIdConnect 對其用戶進行身份驗證的 MVC 客戶端(名為 MVCClient),對其用戶使用不記名身份驗證的 Web API 客戶端(名為 API)設計為 API 客戶端的控制臺應用程序(名為 ResourceOwnerClient)我正在嘗試做的是將 API 項目合并到 MVCClient 中,以便 MVCClient 既可以使用 OIDC 對來自其 MVC 網站的用戶進行身份驗證,也可以使用承載身份驗證對 ResourceOwnerClient 進行身份驗證。我對 MVCClient 的 Startup.cs 進行了以下更改:改為services.AddMvc();:services.AddMvc(config =>{    var policy = new AuthorizationPolicyBuilder(new[]        {            JwtBearerDefaults.AuthenticationScheme,            CookieAuthenticationDefaults.AuthenticationScheme,            "oidc"        })        .RequireAuthenticatedUser()        .Build();    config.Filters.Add(new AuthorizeFilter(policy));});將 JWT 不記名選項添加到services.AddAuthentication():.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>{    options.Authority = "http://localhost:5000";    options.RequireHttpsMetadata = false;    options.Audience = "api1";})現在從技術上講,這確實有效,因為 ResourceOwnerClient 和 MVC 用戶都可以成功地通過 MVCClient 進行身份驗證。然而,我有一個警告:當我從 MVC 端對用戶進行身份驗證時,我注意到我當前的用戶中有兩個身份。兩者在聲明等方面都是相同的。這只發生在我在 MVCClient 中設置斷點時,在 IdentityServer 上只有一個身份。在 IdentityServer 上,我注冊了一個 UserClaimsPrincipalFactory,它將我自己的自定義聲明添加到 ClaimsIdentity。在 IdentityServer 上的兩個身份中,我可以看到重復的聲明。因此,我看到的不是一個身份和兩個自定義聲明,而是兩個身份,每個身份都有 4 個自定義聲明。我的 UserClaimsPrincipalFactory 中的 CreateAsync 方法也被單次登錄擊中 5 次。雖然這種行為很奇怪,但它似乎沒有任何負面影響。但這只是我正在構建的更大應用程序的概念證明,我擔心我將來可能會因此遇到問題。如果有人以前嘗試過這種事情,或者知道為什么會發生這種行為,我們將不勝感激。
查看完整描述

1 回答

?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

雖然這種設計不會發生任何不好的事情,但我會完全改造它。為什么?因為您正在混合 aClient和 an ApiResource,它們應該在邏輯上分開。AClient是一個應用程序,一些用戶與之交互的東西,即使它是一個無頭的應用程序(即自動化服務);而 anApiResource由提供給 Clients 的資源組成,因此沒有用戶可以直接與其交互。


您可以針對 IdentityServer 添加兩種身份驗證,一種作為 API(并將其添加為JwtBearer),另一種作為客戶端(并將其添加為Cookies)。然后,您可以根據該動作/控制器的功能使用[Authorize(AuthenticationSchemes = "JwtBearer")]和。= "Cookies"


撇開這一點不談,問題是您的應用程序正在為 MVC 端獲取一個身份,而為 API 端獲取一個身份,因為它無法告訴您想要哪個身份。


只要你有一個想法,這就是我的一個帶有 ASP.NET Core Identtiy 的 IdentityServer 的樣子,你可以使用 UI 登錄它,還可以使用 JwtToken 訪問 REST 端點:


services

    .AddAuthentication(options =>

    {

        options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;

        options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;

        options.DefaultSignInScheme = IdentityConstants.ExternalScheme;

    })

    .AddIdentityServerAuthentication(JwtBearerDefaults.AuthenticationScheme, options =>

    {

        options.Authority = Configuration["IdentityServerUrl"];

        options.ApiName = Configuration["ApiName"];


        options.RequireHttpsMetadata = false;

    })

    .AddCookie(IdentityConstants.ApplicationScheme, o =>

    {

        o.LoginPath = new PathString("/Account/Login");

        o.Events = new CookieAuthenticationEvents()

        {

            OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync

        };

    })

    .AddCookie(IdentityConstants.ExternalScheme, o =>

    {

        o.Cookie.Name = IdentityConstants.ExternalScheme;

        o.ExpireTimeSpan = TimeSpan.FromMinutes(5.0);

    })

    .AddCookie(IdentityConstants.TwoFactorRememberMeScheme, o =>

    {

        o.Cookie.Name = IdentityConstants.TwoFactorRememberMeScheme;

    })

    .AddCookie(IdentityConstants.TwoFactorUserIdScheme, o =>

    {

        o.Cookie.Name = IdentityConstants.TwoFactorUserIdScheme;

        o.ExpireTimeSpan = TimeSpan.FromMinutes(5.0);

    });


查看完整回答
反對 回復 2022-10-15
  • 1 回答
  • 0 關注
  • 155 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號