在 aspnet core 中使用 Google OAuth 保护 Web 服务
Using Google OAuth to secure web services in aspnet core
我迷失在 OAuth 和 OpenIDConnect 以及 aspnet 核心中间件中。如有任何帮助,我们将不胜感激。
我有多个 UI(网络、本机应用)使用同一组网络服务,我想确保只有经过身份验证的用户才能访问这些网络服务。我的组织使用 Google 个帐户,因此我想使用 Google 仅限于组织域的身份验证。
该网站正确地要求身份验证,紧随 this sample。我现在需要的是让网站 (AngularJS 4) 使用我可以用 Google.
验证的身份验证令牌调用我的后端 Web 服务
后端服务是用aspnet core写的。我试过使用这些方法:Google middleware and Google OpenIDConnect 但这些方法仍然 1) 假设有一个 UI 可以提示未经授权的用户登录,并且 2) 似乎是基于 cookie 的,我赢了没有用于 Web 服务调用的 cookie。
我不想提示用户登录,因为本例中的 "user" 是一个软件客户端。他们要么已经通过身份验证,要么还没有。我只需要获取身份验证令牌,验证它,然后继续。
This appears to be the same question,也没有回答
如有任何建议,我们将不胜感激。此外,关于让本机应用程序执行相同操作的建议或提示!
我会尽力帮忙的。
首先,您需要查看 OpenID Connect(建立在 OAuth 2.0 之上),记住 OAuth 2.0 NOT an Authentication protocol.
1) 假设有一个 UI
假设您使用的是 Google 服务,则不需要 UI 登录。您只需要检查 的存在并验证 访问令牌、身份令牌(也许还有刷新令牌)。如果没有令牌,则假设用户未通过身份验证并将他们重定向到带有授权请求的身份验证服务器。
如果存在有效的访问令牌和刷新令牌,那么您可以假设用户已通过身份验证。
您还可以检查访问令牌是否正确 "Scopes" 以确定它们是否已针对您的特定应用程序获得授权。
如果您使用 Google 作为授权服务器,您可以 validate the the hd parameter 在具有所需域的身份令牌中。
顺便说一句:不涉及 cookie。
希望对您有所帮助。
成功了。如前所述,我迷路了,而 OpenIDConnect 虽然在多个领域被引用为解决方案,但对于 Web 服务来说却是一条红鲱鱼。这是我现在可以使用的方法,我可以提供尽可能完整的步骤(需要进行一些清理):
- 向 UI 添加身份验证 following these directions
- 获取JWT令牌as shown in the first segment here
在每个 Web 服务调用中,将 JWT 令牌包含在 headers:
名称:身份验证
价值:不记名{代币价值}
在web服务中Startup的ConfigureServices方法中,AddMvc()后:
services.AddAuthorization(options =>
{ // this policy needed only if you want to restrict to accounts within your domain. otherwise, don't use options. or use whatever options work for you.
options.AddPolicy("hd",
policy => policy.RequireAssertion(context =>
context.User.HasClaim(c =>
c.Type == "hd" &&
("https://accounts.google.com".Equals(c.Issuer) ||
"accounts.google.com".Equals(c.Issuer, StringComparison.CurrentCultureIgnoreCase)) &&
c.Value == "yourdomain.com"
)));
});
在Configure方法中,在你使用Mvc()之前:
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);
也许有更合适的方法...如果有,我有兴趣尝试一下。目前,这是有效的。
我迷失在 OAuth 和 OpenIDConnect 以及 aspnet 核心中间件中。如有任何帮助,我们将不胜感激。
我有多个 UI(网络、本机应用)使用同一组网络服务,我想确保只有经过身份验证的用户才能访问这些网络服务。我的组织使用 Google 个帐户,因此我想使用 Google 仅限于组织域的身份验证。
该网站正确地要求身份验证,紧随 this sample。我现在需要的是让网站 (AngularJS 4) 使用我可以用 Google.
验证的身份验证令牌调用我的后端 Web 服务后端服务是用aspnet core写的。我试过使用这些方法:Google middleware and Google OpenIDConnect 但这些方法仍然 1) 假设有一个 UI 可以提示未经授权的用户登录,并且 2) 似乎是基于 cookie 的,我赢了没有用于 Web 服务调用的 cookie。
我不想提示用户登录,因为本例中的 "user" 是一个软件客户端。他们要么已经通过身份验证,要么还没有。我只需要获取身份验证令牌,验证它,然后继续。
This appears to be the same question,也没有回答
如有任何建议,我们将不胜感激。此外,关于让本机应用程序执行相同操作的建议或提示!
我会尽力帮忙的。
首先,您需要查看 OpenID Connect(建立在 OAuth 2.0 之上),记住 OAuth 2.0 NOT an Authentication protocol.
1) 假设有一个 UI 假设您使用的是 Google 服务,则不需要 UI 登录。您只需要检查 的存在并验证 访问令牌、身份令牌(也许还有刷新令牌)。如果没有令牌,则假设用户未通过身份验证并将他们重定向到带有授权请求的身份验证服务器。
如果存在有效的访问令牌和刷新令牌,那么您可以假设用户已通过身份验证。
您还可以检查访问令牌是否正确 "Scopes" 以确定它们是否已针对您的特定应用程序获得授权。
如果您使用 Google 作为授权服务器,您可以 validate the the hd parameter 在具有所需域的身份令牌中。
顺便说一句:不涉及 cookie。
希望对您有所帮助。
成功了。如前所述,我迷路了,而 OpenIDConnect 虽然在多个领域被引用为解决方案,但对于 Web 服务来说却是一条红鲱鱼。这是我现在可以使用的方法,我可以提供尽可能完整的步骤(需要进行一些清理):
- 向 UI 添加身份验证 following these directions
- 获取JWT令牌as shown in the first segment here
在每个 Web 服务调用中,将 JWT 令牌包含在 headers:
名称:身份验证
价值:不记名{代币价值}
在web服务中Startup的ConfigureServices方法中,AddMvc()后:
services.AddAuthorization(options => { // this policy needed only if you want to restrict to accounts within your domain. otherwise, don't use options. or use whatever options work for you. options.AddPolicy("hd", policy => policy.RequireAssertion(context => context.User.HasClaim(c => c.Type == "hd" && ("https://accounts.google.com".Equals(c.Issuer) || "accounts.google.com".Equals(c.Issuer, StringComparison.CurrentCultureIgnoreCase)) && c.Value == "yourdomain.com" ))); });
在Configure方法中,在你使用Mvc()之前:
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);
也许有更合适的方法...如果有,我有兴趣尝试一下。目前,这是有效的。