IdentityServer4實現Oauth2.0四種模式之隱藏模式


 

接上一篇:IdentityServer4實現OAuth2.0四種模式之密碼模式,密碼模式將用戶的密碼暴露給了客戶端,這無疑是不安全的,隱藏模式可以解決這個問題,由用戶自己在IdentityServer服務器進行登錄驗證,客戶端不需要知道用戶的密碼。

一,服務端配置

1,添加客戶端:在IentityServer項目添加一個客戶端用於支持隱藏模式訪問。隱藏模式只需要用戶登錄驗證,不需要客戶端密碼。

IdentityServer.Config.Getlients

public static IEnumerable<Client> GetClients()
        {
            return new Client[] {
              
                new Client()
                {
                    //客戶端Id
                     ClientId="apiClientCd",
                     //客戶端密碼
                     ClientSecrets={new Secret("apiSecret".Sha256()) },
                     //客戶端授權類型,ClientCredentials:客戶端憑證方式
                     AllowedGrantTypes=GrantTypes.ClientCredentials,
                     //允許訪問的資源
                     AllowedScopes={
                        "secretapi"
                    }
                },
                new Client()
                {
                    //客戶端Id
                     ClientId="apiClientPassword",
                     //客戶端密碼
                     ClientSecrets={new Secret("apiSecret".Sha256()) },
                     //客戶端授權類型,ResourceOwnerPassword:用戶名密碼模式
                     AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,
                     //允許訪問的資源
                     AllowedScopes={
                        "secretapi"
                    }
                }
                ,
                new Client()
                {
                    //客戶端Id
                     ClientId="apiClientImpl",
                     ClientName="ApiClient for Implicit",
                     //客戶端授權類型,Implicit:隱藏模式
                     AllowedGrantTypes=GrantTypes.Implicit,
                     //允許登錄后重定向的地址列表,可以有多個
                    RedirectUris = {"https://localhost:5002/auth.html" },
                     //允許訪問的資源
                     AllowedScopes={
                        "secretapi"
                    },
                     //允許將token通過瀏覽器傳遞
                     AllowAccessTokensViaBrowser=true
                }
            };
        }

2,添加IdentityServer的ui模板。

微軟為IdentityServer4創建了一系列的模板,可以在命令行中使用dotnet new -IdentityServer4.Templates安裝。然后在IdentityServer項目根據目錄下打開命令行,運行dotnet new is4ui 安裝IdentityServer的ui模板。會自動添加Quickstart、wwwroot、Views三個文件夾到此目錄

 

  

添加好ui模板后,還需要啟用IdentityServer項目的mvc功能。修改IdentityServer.Startup.ConfigureServices,添加一行代碼

  services.AddMvc();

修改IdentityServer.Startup.Configure,添加二行代碼

          //訪問wwwroot目錄靜態文件
            app.UseStaticFiles();
            //使用Mvc中間件
            app.UseMvcWithDefaultRoute();

二,Mvc客戶端配置

添加跳傳頁面

在第一步的客戶端實例化中配置了RedirectUris = {"https://localhost:5002/auth.html" },這是一個跳轉頁面,用戶在IdentityServer上登錄成功后將會帶着access_token自動跳轉到這個頁面。現在這個頁面還沒有創建。

在IdentityMvc項目的wwwroot目錄下創建一個名為auth的html頁面。用於redirect_uri。如果uri瞄點中帶有token,把token顯示在頁面上。

IdentityMvc/wwwroot/auth.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript">
        var token = null;
        window.onload = function () {
            var url = window.location.href;

            var array = url.split("#");
            if (array.length > 1) {
                token = array[1];
             document.getElementById("content").innerHTML = token;
            }
        }
    </script>
</head>
<body>
    <div id="content"></div>
</body>
</html>

三,獲取access_token

根據OAuth2.0協議,隱藏模式需要傳的參數如下所示。

client_id:客戶端Id
redirect_uri=重定向Url,用戶登錄成功后跳回此地址
response_type=token,固定值,表示獲取token
scope=secretapi,此token需要訪問的api

接受參數的地址則是IdentityServer的Discover文檔中的authorization_endpoint節點。把參數和地址拼接成以下地址:http://localhost:5000/connect/authorize?client_id=apiClientImpl&redirect_uri=https://localhost:5002/auth.html&response_type=token&scope=secretapi,直接訪問,會跳轉到用戶登錄頁面

 

 

 

 

 使用之前添加的用戶:apiUser登錄,確認授權訪問secretapi這個api資源

 

 確認后,瀏覽器將會自動跳轉到redirect_url,也就是我們第一步建立的html頁面。

發現token已經被打印出來了。使用這個token用於Bearer授權驗證就可以訪問標識為secretapi的api資源。訪問一下之前的測試接口。

 

 

 隱藏模式解決了客戶端模式用戶身份驗證和授權的問題,也解決了密碼模式面臨的用戶密碼暴露的問題,適應於全前端沒有后端的第三方應用。但由於token攜帶在url中,安全性方面不能保證。下一篇講的授權碼模式在安全性方面做得更好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM