我迷失在OAuth和OpenIDConnect以及aspnet核心中间件中。任何有关这方面的帮助将不胜感激。
我有多个使用同一组Web服务的UI(Web,本机应用程序),我想确保只有经过身份验证的用户才能访问Web服务。我的组织使用Google帐户,因此我希望将Google身份验证限制在组织域中。
在this sample之后,网站正确地要求进行身份验证。我现在需要的是让网站(AngularJS 4)使用我可以通过Google验证的身份验证令牌来调用我的后端Web服务。
后端服务是用aspnet核心编写的。我尝试过使用这些方法:Google middleware和Google OpenIDConnect但这些仍然1)假设有一个UI可以提示未经授权的用户登录,2)似乎是基于cookie的,并且我不会为网络服务电话提供cookie。
我不想提示用户登录,因为在这种情况下“用户”是软件客户端。要么已经过身份验证,要么已经过身份验证。我只需要获取身份验证令牌,验证它,然后继续。
This appears to be the same question,尚未得到回答。
任何建议都表示赞赏。此外,有关本机应用程序的建议或提示也是如此!
答案 0 :(得分:3)
搞定了。如上所述,我迷路了,OpenIDConnect虽然在几个方面被引用作为解决方案,但却是Web服务的红色鲱鱼。这里有什么对我有用,我可以提供完整的步骤(需要一些清理):
在每次Web服务调用中,在标题中包含JWT标记:
名称:身份验证
价值:持票人{令牌价值}
在Web服务的Startup的ConfigureServices方法中,在AddMvc()之后:
JwtBearerOptions jwtOptions = new JwtBearerOptions();
jwtOptions.Audience = "{the OAuth 2.0 client ID credential from google api developer console}";
jwtOptions.Authority = "https://accounts.google.com";
jwtOptions.TokenValidationParameters = new TokenValidationParameters();
jwtOptions.TokenValidationParameters.ValidIssuers = new List<string>()
{
"https://accounts.google.com",
"accounts.google.com"
};
app.UseJwtBearerAuthentication(jwtOptions);
在Configure方法中,在UseMvc():
之前 TDest MapSourceToDest(TSource v) {....}
Func<TSource, bool> func = ...;
Func<TDest, bool> dbFunc = x => func(MapSourceToDest(x));
也许有更合适的方法来做到这一点......如果有的话,我有兴趣尝试一下。目前,这是有效的。
答案 1 :(得分:0)
我会尽力帮助。
首先,您需要查看OpenID Connect(构建于OAuth 2.0之上),记住OAuth 2.0 NOT an Authentication protocol。
1)假设有一个UI 假设您使用的是Google服务,则无需用户界面登录。您只需要检查是否存在并验证访问令牌,身份令牌(可能还有刷新令牌)。如果没有令牌,则假定用户未经过身份验证,并使用授权请求将其重定向到身份验证服务器。
如果存在有效的访问令牌和刷新令牌,则可以假设用户已通过身份验证。
您还可以检查访问令牌以获取正确的&#34;范围&#34;确定它们是否为您的特定应用程序授权。
如果您使用Google for Authorization Server,则身份令牌中的validate the the hd parameter可以拥有所需的域。
顺便说一句:没有涉及cookie。
希望有所帮助。