我在使用Thinktecture身份服务器v3集成外部提供商,即谷歌时遇到问题。我收到以下错误:"客户端应用程序未知或未经授权。" 任何人都对这个错误有所了解。
答案 0 :(得分:16)
@Whever,看起来你的客户端和服务器上的RedirectUri值不匹配。
客户端启动中的RedirectUri属性定义身份服务器验证后将调用的URI。服务器配置中的RedirectUris定义了可以请求身份验证的允许URI列表。因此,客户端启动RedirectUri必须包含在服务器的RedirectUris列表中。
看起来您的客户端的RedirectUri当前指向服务器的URI。您的客户端是否在端口46289上运行?如果是这样,请尝试将客户端启动中的RedirectUri属性值更改为https://localhost:46289。您可能还想尝试修改服务器的redirectUris值以使用https而不是http,假设您的客户端确实可以通过https访问。
服务器客户端存储:
public static IEnumerable<Client> Get()
{
return new[] {
new Client {
Enabled = true,
ClientName = "MVC Client",
ClientId = "mvc",
Flow = Flows.Implicit,
RedirectUris = new List<string>{
"https://localhost:46289/" // client home url
客户端启动:
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions {
Authority = "https://localhost:44300/identity",
ClientId = "mvc",
RedirectUri = "https://localhost:46289/", //must be in server's Client.RedirectUris
ResponseType = "id_token",
SignInAsAuthenticationType = "Cookies"
});
答案 1 :(得分:6)
我有这个问题。服务器中的RedirectUris条目几乎与客户端Startup.Configuration中的RedirectUri匹配;除了尾随斜线之外的一切。
https://localhost:46289/
与
不同https://localhost:46289
当我添加斜杠时,我的登录页面出现了。
答案 2 :(得分:2)
我一直在处理同样的问题,但只是对身份服务器进行身份验证(Google就在我的列表中接下来)。我看到了这个问题,因为客户端的范围没有在Mvc和服务器上设置。为解决此问题,我将Scopes添加到(Mvc客户端的)Startup类中,如下所示:
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44301",
Scope = "openid profile email roles",
ClientId = "mvc",
RedirectUri = "https://localhost:44300/",
ResponseType = "id_token",
SignInAsAuthenticationType = "Cookies"
});
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
}
}
..以及服务器的客户列表:
public static class Clients
{
public static IEnumerable<Client> Get()
{
return new[]
{
new Client
{
Enabled = true,
ClientName = "MVC Client",
ClientId = "mvc",
Flow = Flows.Implicit,
RequireConsent = true,
RedirectUris = new List<string>
{
"https://localhost:44300/"
},
PostLogoutRedirectUris = new List<string>
{
"https://localhost:44300/"
},
AllowedScopes = new List<string> {
Constants.StandardScopes.OpenId,
Constants.StandardScopes.Profile,
Constants.StandardScopes.Email,
Constants.StandardScopes.Roles
}
}
};
}
}
关于OP对Google的提问,可能值得检查您的范围与Google Developer Console中的应用设置支持的范围相关。在Where can I find a list of scopes for Google's OAuth 2.0 API?
支持的范围内有一篇很好的SO帖子希望有所帮助:)
答案 3 :(得分:0)
看起来客户端(您希望有可能使用Google登录的应用程序)未在客户端商店中注册。您能否展示您的启动配置?
答案 4 :(得分:0)
在我的情况下,当我应该更改时,我不小心并且正在更改UseOpenIdConnectAuthentication下的Startup.cs中的值(这是集成Web应用程序用来连接到自身的那些)。 Clients.Get()中的值,这些是服务器已配置的允许客户端。
一旦我解决了这些问题,我就可以将客户端和服务器分成两个应用程序,只有一些NuGet包和客户端应用程序中的UseCookieAuthentication / UseOpenIdConnectAuthentication。
如果客户端未启用,重定向uri与列表中的不匹配(使用非区分大小写的完全匹配),如果请求的范围不在允许的范围列表中,如果请求的流,则可以获取错误与允许的内容不匹配(每个客户端只能有一个)和/或客户端ID不匹配。