Identity Server 3 - 客户端应用程序未知或未经授权
Posted
技术标签:
【中文标题】Identity Server 3 - 客户端应用程序未知或未经授权【英文标题】:Identity Server 3 - The client application is not known or is not authorized 【发布时间】:2016-10-06 07:00:32 【问题描述】:我收到错误消息“客户端应用程序未知或未经授权。”访问我网站的受保护区域时。
这是我的客户:
public static class Clients
public static IEnumerable<Client> Get()
return new[]
new Client
Enabled = true,
ClientName = "Web Application",
ClientId = "webapplication",
Flow = Flows.AuthorizationCode,
ClientSecrets = new List<Secret>
new Secret("webappsecret".Sha256())
,
RedirectUris = new List<string>
UrlManager.WebApplication
,
PostLogoutRedirectUris = new List<string>
UrlManager.WebApplication
,
AllowedScopes = new List<string>
Constants.StandardScopes.OpenId,
Constants.StandardScopes.Profile,
Constants.StandardScopes.Email,
Constants.StandardScopes.Roles,
Constants.StandardScopes.OfflineAccess,
"read",
"write"
;
这是我的网络应用程序启动:
public class Startup
public void Configuration(IAppBuilder app)
app.UseCookieAuthentication(new CookieAuthenticationOptions
AuthenticationType = "Cookies"
);
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
Authority = UrlManager.AuthenticationService + "identity",
ClientId = "webapplication",
Scope = "openid profile",
ResponseType = "code id_token",
RedirectUri = UrlManager.WebApplication,
SignInAsAuthenticationType = "Cookies"
);
这是我的身份验证服务(安装了 IDS3)启动:
public class Startup
public void Configuration(IAppBuilder app)
app.Map("/identity", idsrvApp =>
idsrvApp.UseIdentityServer(new IdentityServerOptions
SiteName = "Authentication Service - Embedded IdentityServer",
SigningCertificate = Certificate.LoadCertificate(),
Factory = new IdentityServerServiceFactory()
.UseInMemoryUsers(Users.Get())
.UseInMemoryClients(Clients.Get())
.UseInMemoryScopes(Scopes.Get())
);
);
这是 UrlManager:
public static class UrlManager
public static string WebApplication
get return "https://localhost:44381/";
public static string AuthenticationService
get return "https://localhost:44329/";
这是我的家庭控制器:
public class HomeController : Controller
public ActionResult Index()
return View();
[Authorize]
public ActionResult Private()
return View((User as ClaimsPrincipal).Claims);
当我访问 Private 时,我看到一个 Identity Server 3 屏幕,显示错误消息“客户端应用程序未知或未授权。”。
我已经读到这可能来自重定向 URI 中的不匹配,但据我所知,我的是正确的。我不知道还有什么可能导致它。如果我将流程更改为隐式但我想实现 AuthorizationCode 流程,则应用程序可以完美运行。
文档似乎也没有说明这一点。
【问题讨论】:
【参考方案1】:如果您的 ClientUri 域名与您的 ClientRedirectUri 域名不匹配,也会发生这种情况。
看到我遇到这个问题是因为缺少“www”。在客户端重定向 uri 中。
问题 - ClientRedirectUri 没有“www”。在里面:
ClientUri: https://www.mydomainname.co.uk
ClientRedirectUri: https://mydomainname.co.uk/umbraco/surface/UmbracoIdentityAccount/ExternalLoginCallback
解决方案 - ClientRedirectUri 有“www”。在其中,就像 ClientUri 所做的那样:
ClientUri: https://www.mydomainname.co.uk
ClientRedirectUri: https://www.mydomainname.co.uk/umbraco/surface/UmbracoIdentityAccount/ExternalLoginCallback
【讨论】:
【参考方案2】:我收到了这个错误,问题是 RedirectUri. 在授权服务器中是 http://localhost:56840/,在 Web 应用程序中是 http://localhost:56840。 请注意网址末尾缺少的“/”。
【讨论】:
我很想知道你是如何纠正这个问题的,如果它是真正的错误的话。干杯【参考方案3】:客户端已配置为授权码流
Flow = Flows.AuthorizationCode
但是启动中的响应类型设置为混合流。
ResponseType = "code id_token"
尝试将其更改为
ResponseType = "code"(或将 Flow 类型更改为 Hybrid)
下面是ResponseType列表和对应的Flow
【讨论】:
谢谢。您在哪里找到该流程图? @RayLoveless - 来自 OIDC 规范 -> openid.net/specs/openid-connect-core-1_0.html#Authentication PKCE 的授权码怎么样?我似乎无法让它发挥作用。以上是关于Identity Server 3 - 客户端应用程序未知或未经授权的主要内容,如果未能解决你的问题,请参考以下文章
将外部登录令牌从 Identity Server 流向客户端应用程序
谁为 Identity Server 4 提供客户端 ID 和客户端密码?