1. 程式人生 > 實用技巧 >.Net Core WebApi(三)--使用 IdentityServer4 4.1.1 踩坑記錄

.Net Core WebApi(三)--使用 IdentityServer4 4.1.1 踩坑記錄

目的:建立IdentityServer 並通過PostMan驗證獲取token

第一次配置如下
 public class Config
    {
        public static IEnumerable<ApiResource> GetResource()
        {
            return new List<ApiResource>
              { new ApiResource("api","My Api") };
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client> { new Client()
            {
            ClientId="client",
            AllowedGrantTypes=GrantTypes.ClientCredentials,
            ClientSecrets={ new Secret("secret".Sha256())},
            AllowedScopes={"api"}
            } };
        }
    }

PostMan的請求如圖

http://localhost:5000/connect/token

結果顯示 請求無效 參照教程 >https://www.cnblogs.com/monster17/p/13261647.html 得知是因為傳參格式的問題

  • 1.我們將Body改為 格式
  • 2.加引數<AllowedScopes: api> 【指定的api為配置Config中apiresource的名稱】 再次請求
    如圖

結果又顯示scope無效 【這裡懵逼了很久 明明Config中apiResource的name 和client中AllowedScopes的介面是一致的】
但是參照報錯 一定是scop的問題 於是去找了一下官方文件關於API Resources

的使用

https://identityserver4.readthedocs.io/en/latest/topics/resources.html?highlight=apiresource#api-resources

參照原文

這裡也便可以理解 問題所在了。 apiResource並不等同於scope 它相當於是scopes集合的統稱 實現了scope的分組【但具體的scope還是要進行設定的 我們先前的Config 缺少具體scope =。= 真是令人頭大】

先參照例子理解一下

//建立多個scope
{
    return new List<ApiScope>
    {
        // invoice API specific scopes
        new ApiScope(name: "invoice.read",   displayName: "Reads your invoices."),
        new ApiScope(name: "invoice.pay",    displayName: "Pays your invoices."),

        // customer API specific scopes
        new ApiScope(name: "customer.read",    displayName: "Reads you customers information."),
        new ApiScope(name: "customer.contact", displayName: "Allows contacting one of your customers."),

        // shared scope
        new ApiScope(name: "manage", displayName: "Provides administrative access to invoice and customer data.")
    };
}

//調取時 將多個scope的Name加參時 可能會很長很長 為了方便 我們將scope 進行分組 後期可直接呼叫**統稱** 這裡分成兩組
public static readonly IEnumerable<ApiResource> GetApiResources()
{
    return new List<ApiResource>
    {
        new ApiResource("invoice", "Invoice API")//設定每組scopes的統稱
        {
            Scopes = { "invoice.read", "invoice.pay", "manage" }//設定每組scope具體名稱
        },

        new ApiResource("customer", "Customer API")
        {
            Scopes = { "customer.read", "customer.contact", "manage" }
        }
    };
}

再來回頭看看我們的Config 修改如下

    public class Config
    {

        public static IEnumerable<ApiResource> GetApiResources()
        {
            return new List<ApiResource>() { 
                new ApiResource("api", "My api") { Scopes={"api1","api2"} //將具體的scopes 歸為一組 統稱為api
            } };
        }
        //建立具體的scope
        public static IEnumerable<ApiScope> GetApiScopes()
        {
            return new List<ApiScope> { 
                new ApiScope("api1","My first api"),
                new ApiScope("api2","My second api")};
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>() { new Client {
            ClientId="client",
            AllowedGrantTypes=GrantTypes.ClientCredentials,
            ClientSecrets={new Secret("secret".Sha256()) },
            AllowedScopes={ "api1","api2"}//此處一定要配置具體的scope名稱 外部呼叫可直接配置為 api【統稱】
            } };
        }

用PostMan驗證一下

成功了 emmmm 又是美好的一天【還是要多讀源文件e =.=】