首页 > 解决方案 > 使用 Web API -Identity Server 4 的 Wpf 应用程序

问题描述

WPF OidcClient:

var options = new 
    {
    //redirect to identity server
    Authority = "http://localhost:5000/",
    ClientId = "native.code",
    Scope = "openid profile email fiver_auth_api",
    //redirect back to app if auth success
    RedirectUri = "http://127.0.0.1/sample-wpf-app",
    ResponseMode = OidcClientOptions.AuthorizeResponseMode.FormPost, 
    Flow = OidcClientOptions.AuthenticationFlow.AuthorizationCode,
    Browser = new WpfEmbeddedBrowser()
};

WPF 调用 web api:

private void CallButtonAsync()
    {
        var accessToken = token;

        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        //on button click call Web api Get movies
        //Initialize HTTP Client 
        client.BaseAddress = new Uri("http://localhost:5001");
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        try
        {
            HttpResponseMessage response = client.GetAsync("/movies/get").Result;
            MessageBox.Show(response.Content.ReadAsStringAsync().Result);
        }
        catch (Exception)
        {
            MessageBox.Show("Movies not Found");
        }

    }

Identity Server - WPF 声明为客户端 //wpf 桌面应用程序

new Client
{
    ClientId = "native.code",
    ClientName = "Native Client (Code with PKCE)",

    RedirectUris = { "http://127.0.0.1/sample-wpf-app" },
    PostLogoutRedirectUris = { "http://localhost:5000" },

    RequireClientSecret = false,
    RequireConsent = true,

    AllowedGrantTypes = GrantTypes.Code,
    AllowedScopes =
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.Email,
        IdentityServerConstants.StandardScopes.OfflineAccess,
        "fiver_auth_api"
    },
    AlwaysIncludeUserClaimsInIdToken = true,
    IdentityTokenLifetime=3600,

}

web api 只能在用户授权时使用。我在 wpf 应用程序中获得了令牌,但是在调用 web api 时我得到了 401(未授权)。

我错过了什么?

标签: wpfasp.net-web-apiidentityserver4

解决方案


我最好的是你错过了

AllowOfflineAccess = true

IdentityServer 定义客户端时


推荐阅读