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

 

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

一,服務端配置

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

IdentityServer.Config.Getlientshtml

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,添加一行代碼java

  services.AddMvc();

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

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

二,Mvc客戶端配置

添加跳傳頁面api

在第一步的客戶端實例化中配置了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協議,隱藏模式須要傳的參數以下所示。mvc

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中,安全性方面不能保證。下一篇講的受權碼模式在安全性方面作得更好。

相關文章
相關標籤/搜索