一区在线电影,国产在线首页,中文字幕精,天天爽天天射,夜色99,日韩国产成人av,伊人久久综合视频

威勢網(wǎng)絡(luò),為您的企業(yè)和團隊注入互聯(lián)網(wǎng)活力!
服務(wù)熱線:138-9741-0341

[原創(chuàng)] IdentityServer4權(quán)限控制---使用 ASP.NET Core 的交互式應(yīng)用程序(四)

發(fā)布日期:2022/9/4 作者: 瀏覽:899

  寫了半天,不小心一關(guān)瀏覽器,沒了!我也是醉了。。。又重新寫一遍吧!

     前面三節(jié)課我們學(xué)習(xí)了用一個客戶端先去申請令牌,得到令牌后再去訪問API資源這樣一個簡單的流程,也是一個很常見的功能,通過前三節(jié)課的學(xué)習(xí),我們搭建了一臺API資源服務(wù)器,一臺IDS4SERVER身份認(rèn)證服務(wù)器,這節(jié)課我們接著上面的內(nèi)容繼續(xù)學(xué)習(xí)一下交互式登錄的流程。

    開始之前,我先交待一下今天的學(xué)習(xí)任務(wù)吧!今天我們要用前面的IDS4SERVER服務(wù)器為我們新建的一個站點完成身份驗證的過程,整個驗證過程中有登錄交互,有登錄成功后的跳轉(zhuǎn),有登出功能,同樣,客戶拿到令牌后,對我們的網(wǎng)站擁有了“訪問受保護資源的功能”。本文的標(biāo)題后半部分是根據(jù)官方的文檔直譯的,想看原文的在這里,為了實現(xiàn)實驗?zāi)康?,我們需要做的工作有,?chuàng)建一個MYMVC的新站點,該站點有首頁、WHOAMI、LOGOUT等頁面與功能,其中首頁和隱私說明頁是模板自帶的,可以匿名瀏覽,而WHOAMI是登錄后才可訪問的,LOGOUT可以現(xiàn)在登出功能。除此之外,我們要做的工作還有搭建一臺IDS4SERVER服務(wù)器,為站點提供身份驗證功能。OK,我們開始吧!

    我們需要先搭建一臺IDS4SERVER服務(wù)器,不會的朋友們請參考這里:


[原創(chuàng)] IdentityServer4權(quán)限控制---客戶端授權(quán)模式之IDS4認(rèn)證服務(wù)器搭建(二)

懶一些的朋友也可以直接這里下載: IdentityServer4 ,注意,因為我們要增加一些交互功能,而第二節(jié)課中的IDS4SERVER服務(wù)器并沒有交互頁面,所以我們還需要增加一個控制器和VIEW視圖界面,如果你是用我剛剛提到的鏈接搭建的服務(wù)器,則把這些代碼下下來放到項目中去,以給服務(wù)器添加控制器與視圖交互功能,如果用的是官方的,則跳過這一步。上面鏈接提供的代碼都是官方的DEMO,我只是改了一下命名空間名字。對了,代碼放進去以后還要把控制器路由打開才行,不然代碼無法訪問,打開PROGRAM.CS文件,加入代碼
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"); 這樣控制器就可以使用了,我們試著運行一下,并在瀏覽器中訪問一下試試。



OK,說明我們的代碼可以正常運行了。

  緊接著我們再新建一個MYMVC站點。


新建一個MYMVC的站點


指定存放目錄

然后選擇.NET6.0,HTTPS支持,其它默認(rèn),一路生成下來,我們的新站點就OK了,我們?yōu)榱俗屨军c支持 OpenID Connect authentication協(xié)議,我們在PM命令行中運行命令,引入包

dotnet add package Microsoft.AspNetCore.Authentication.OpenIdConnect
打開新站點MYMVC的program.cs加入以下代碼:



using System.IdentityModel.Tokens.Jwt;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddControllersWithViews();

JwtSecurityTokenHandler.DefaultMapInboundClaims = false;
builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
    .AddCookie("Cookies")
    .AddOpenIdConnect("oidc", options =>
    {
        options.Authority = "https://localhost:5001";

        options.ClientId = "mvc";
        options.ClientSecret = "secret";
        options.ResponseType = "code";

        options.SaveTokens = true;
    });

AddAuthentication 將認(rèn)證服務(wù)注入到依賴中去."Cookies" 為默認(rèn) DefaultScheme,  DefaultChallengeScheme 登錄質(zhì)詢方式改為oidc 指定 OpenID Connect 協(xié)議.然后用 AddCookie添加 cookies處理程序, AddOpenIdConnect 配置 OpenID Connect 協(xié)議執(zhí)行. Authority受信 token 地址。 ClientId 和 ClientSecret. 用來標(biāo)識客戶。SaveTokens 用于將來自 IdentityServer 的令牌保存在 cookie 中(因為稍后將需要它們)。再添加以下代碼,
app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

讓以上設(shè)置生效。接下來,我們再改造一下我們的新站點,給它增加一些功能。打開HOMECONTROLLER,添加方法:


        public IActionResult Logout()
        {
            return SignOut("Cookies", "oidc");
        }
        [Authorize]
        public IActionResult Whoami()
        {
            return View();
        }
WHOAMI VIEW頁面



@using Microsoft.AspNetCore.Authentication
<h2>Claims</h2>

<dl>
    @foreach (var claim in User.Claims)
    {
        <dt>@claim.Type</dt>
        <dd>@claim.Value</dd>
    }
</dl>

<h2>Properties</h2>

<dl>
    @foreach (var prop in (await Context.AuthenticateAsync()).Properties.Items)
    {
        <dt>@prop.Key</dt>
        <dd>@prop.Value</dd>
    }
</dl>
再改造一下模塊布局頁,加上相應(yīng)的鏈接,運行一下,如下圖



這時候我們不開身份認(rèn)證服務(wù)器,HOME\PRIVACY均可正常訪問,當(dāng)我們點擊WHOAMI頁面時報以下錯誤:


An unhandled exception occurred while processing the request.

InvalidOperationException: IDX20803: Unable to obtain configuration from: 'System.String'.

Microsoft.IdentityModel.Protocols.ConfigurationManager<T>.GetConfigurationAsync(CancellationToken cancel)



接下來我們對IDS4SERVER服務(wù)器做一些配置

添加對 OpenID Connect 身份 scopes(范圍)的支持

與 OAuth 2.0 類似,OpenID Connect 也使用 scopes(范圍)概念。 同樣, scopes范圍代表您想要保護并且客戶想要訪問的東西。 與 OAuth 相比,OIDC 中的范圍不代表 API,而是代表用戶 ID、姓名或電子郵件地址等身份數(shù)據(jù)。

通過修改 Config.cs 中的 IdentityResources 屬性,添加對標(biāo)準(zhǔn) openid(subject id)和配置文件(first name, last name 等)范圍的支持:
打開config.cs (無語的輸入法...)


        public static IEnumerable<IdentityResource> IdentityResources =>
        new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
        };
然后打開PROGRAM.CS把上面的代碼在 IdentityServer 身份資源中注冊



builder.Services.AddIdentityServer()
    .AddInMemoryIdentityResources(Config.IdentityResources)
    .AddInMemoryApiScopes(Config.ApiScopes)
    .AddInMemoryClients(Config.Clients)
    .AddTestUsers(TestUsers.Users)
    .AddDeveloperSigningCredential();

注意,官網(wǎng)在這里漏寫了最下面一條,如果是測試用,會報錯,用我上面的代碼。標(biāo)準(zhǔn)scopes \claims 的申明,大家可以參考這個鏈接 :All standard scopes and their corresponding claims can be found in the OpenID Connect specification

添加測試用戶:

  官方說:示例 UI 帶有一個內(nèi)存中的“用戶數(shù)據(jù)庫”。 您可以通過添加 AddTestUsers 擴展方法在 IdentityServer 中啟用此功能:AddTestUsers(TestUsers.Users)

我們打開TestUsers.Users

可以看到有alice\bob兩個用戶。注意一下他們的一些NAME/FAMILYNAME等字段信息,后面會用到。

將客戶端標(biāo)識注冊IdentityServer 服務(wù)中:

最后一步是將 MVC 客戶端的新配置條目添加到 IdentityServer。

基于 OpenID Connect 的客戶端與我們目前添加的 OAuth 2.0 客戶端非常相似。 但由于 OIDC 中的流程始終是交互式的,因此我們需要在配置中添加一些重定向 URL。

public static IEnumerable<Client> Clients =>
    new List<Client>
    {
        // machine to machine client (from quickstart 1)
        new Client
        {
            ClientId = "client",
            ClientSecrets = { new Secret("secret".Sha256()) },

            AllowedGrantTypes = GrantTypes.ClientCredentials,
            // scopes that client has access to
            AllowedScopes = { "api1" }
        },
        // interactive ASP.NET Core MVC client
        new Client
        {
            ClientId = "mvc",
            ClientSecrets = { new Secret("secret".Sha256()) },

            AllowedGrantTypes = GrantTypes.Code,

            // where to redirect to after login
            RedirectUris = { "https://localhost:5002/signin-oidc" },

            // where to redirect to after logout
            PostLogoutRedirectUris = { "https://localhost:5002/signout-callback-oidc" },

            AllowedScopes = new List<string>
            {
                IdentityServerConstants.StandardScopes.OpenId,
                IdentityServerConstants.StandardScopes.Profile
            }
        }
    };
OK,大功告成!不出意外的話,我們的服務(wù)器已經(jīng)搭建好了。我們把它運行起來,然后把我們新建的MYMVC站點也運行起來,再去點擊WHOAMI頁面試試,發(fā)現(xiàn)被導(dǎo)航到了認(rèn)證服務(wù)器登錄頁面,注意看后面的端口后5002變成5001了,這是兩個不同的站點。


我們用ALICE:ALICE(小寫,該死的輸入法?。┑卿?,成功以后又返回到我們的新站點,注意看前后端口號的變化

這時候還要注意一個細(xì)節(jié),我讓大家在前面注意的那些NAME之類的字段并沒有成功返回。我們打開MYMVC的PROGRAM.CS,改動代碼如下:

    .AddOpenIdConnect("oidc", options =>  //AddOpenIdConnect is used to configure the handler that performs the OpenID Connect protocol.
    {
        options.Authority = "https://localhost:5001"; //The Authority indicates where the trusted token service is located.

        options.ClientId = "mvc";  //We then identify this client via the ClientId and the ClientSecret
        options.ClientSecret = "secret";
        options.ResponseType = "code";

        options.SaveTokens = true; //SaveTokens is used to persist the tokens from IdentityServer in the cookie (as they will be needed later).

        // ... 讓服務(wù)器返回profile identity scop,如名稱,網(wǎng)站,家庭等
        options.Scope.Add("profile");
        options.GetClaimsFromUserInfoEndpoint = true;
        // ...
    });
然后登出重新請求試試,字段成功返回了。大家自己測試,我就不配圖了。

寫一個控制器Alice,只允許Alice一個人訪問,其他用戶拒絕,該如何實現(xiàn)呢?方法:注冊一個安全策略,

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("Alice", policy => policy.RequireClaim("name", "Alice Smith"));
});

var app = builder.Build();
控制器

[Authorize(Policy = "Alice")]
        public IActionResult Alice()
        {
            return View();
        }

進一步的實驗


隨意向測試用戶添加更多聲明 - 以及更多身份資源。
定義身份資源的過程如下:
將新的身份資源添加到列表中 - 為其命名并指定在請求此資源時應(yīng)返回哪些聲明
通過客戶端配置上的 AllowedScopes 屬性授予客戶端對資源的訪問權(quán)限
通過將資源添加到客戶端中 OpenID Connect 處理程序配置上的 Scopes 集合來請求資源
(可選)如果身份資源與非標(biāo)準(zhǔn)聲明(例如 myclaim1)相關(guān)聯(lián),則在客戶端添加出現(xiàn)在 JSON 中的聲明(從 UserInfo 端點返回)和用戶聲明之間的 ClaimAction 映射
使用 Microsoft.AspNetCore.Authentication
// ...
.AddOpenIdConnect("oidc", options=>
{
    // ...
    options.ClaimActions.MapUniqueJsonKey("myclaim1", "myclaim1");
    // ...
});
還值得注意的是,令牌聲明的檢索是一個可擴展點 - IProfileService。由于我們使用的是 AddTestUsers,因此默認(rèn)使用 TestUserProfileService。您可以在此處檢查源代碼以了解其工作原理。

mymvc源碼下載        IDS4Server.rar

原創(chuàng)文章,創(chuàng)作不易,轉(zhuǎn)載請注明出處http://www.maiyt.com/article-30



下拉加載更多評論
最新評論
暫無!