Identity Server 3 隐式授权,基于角色的授权
Identity Server 3 implicit grant, role based authorization
我已经将身份服务器 3 与成员身份重新启动数据库设置为我的授权服务器,并且还开发了一个 Web Api 项目,该项目将由 javascript 网络应用程序访问。
使用隐式流,客户端能够登录并获得id_token和access_token。现在我有几个问题,我也希望能得到详细的回答:
id_token的功能是什么?获得后可以做什么?
用户的角色作为声明存储在数据库中(例如,"role"、"admin" 的键值)。此时如何进行基于角色的授权? id_token 似乎包含这些声明,但 access_token 没有。在我的 Api 请求中将我的 access_token 作为 Bearer 发送时,api 如何知道发送用户具有哪些角色?
在网络 api 控制器中,我想使用以下方法访问用户信息:
var user = User as ClaimsPrincipal;
使用此代码,我几乎无法获得有关用户的任何信息;用户名、ID 等。另外,当我在控制器中使用 user.Claims
时,我无权访问存储在数据库中的声明。怎么会有两组声明,一组在数据库中,一组在令牌中?!
非常感谢任何额外的信息。
id_token 应该在客户端使用。您可以使用它来访问客户端的声明。 AccessToken 将在 API.
处使用
要包含在 access_token 中的声明,您需要创建一个包含相关声明的范围,并在请求中请求该范围。
创建范围(在 self-host sample 中将范围添加到 Scopes.cs):
new Scope
{
Name = "myApiScope",
DisplayName = "IdentityManager",
Type = ScopeType.Resource,
Emphasize = true,
ShowInDiscoveryDocument = false,
Claims = new List<ScopeClaim>
{
new ScopeClaim(Constants.ClaimTypes.Name),
new ScopeClaim(Constants.ClaimTypes.Role)
}
}
在授权请求中询问范围(在Javascript implicit client - simple中是这样进行的)
function getToken() {
var authorizationUrl = 'https://localhost:44333/core/connect/authorize';
var client_id = 'implicitclient';
var redirect_uri = 'http://localhost:37045/index.html';
var response_type = "token";
var scope = "myApiScope";
var state = Date.now() + "" + Math.random();
localStorage["state"] = state;
var url =
authorizationUrl + "?" +
"client_id=" + encodeURI(client_id) + "&" +
"redirect_uri=" + encodeURI(redirect_uri) + "&" +
"response_type=" + encodeURI(response_type) + "&" +
"scope=" + encodeURI(scope) + "&" +
"state=" + encodeURI(state);
window.location = url;
}
这将在您的访问令牌中包含名称和角色声明
在 web API 启动中使用相关中间件配置您的 API(在 SampleAspNetWebApi 示例中按如下方式完成)
app.UseIdentityServerBearerTokenAuthentication(新的 IdentityServerBearerTokenAuthenticationOptions
{
权限 = "https://localhost:44333/core",
RequiredScopes = new[] { "myApiScope" }
});
然后您可以按如下方式访问声明
var principal = User as ClaimsPrincipal;
return from c in principal.Identities.First().Claims
select new
{
c.Type,
c.Value
};
我已经将身份服务器 3 与成员身份重新启动数据库设置为我的授权服务器,并且还开发了一个 Web Api 项目,该项目将由 javascript 网络应用程序访问。
使用隐式流,客户端能够登录并获得id_token和access_token。现在我有几个问题,我也希望能得到详细的回答:
id_token的功能是什么?获得后可以做什么?
用户的角色作为声明存储在数据库中(例如,"role"、"admin" 的键值)。此时如何进行基于角色的授权? id_token 似乎包含这些声明,但 access_token 没有。在我的 Api 请求中将我的 access_token 作为 Bearer 发送时,api 如何知道发送用户具有哪些角色?
在网络 api 控制器中,我想使用以下方法访问用户信息:
var user = User as ClaimsPrincipal;
使用此代码,我几乎无法获得有关用户的任何信息;用户名、ID 等。另外,当我在控制器中使用 user.Claims
时,我无权访问存储在数据库中的声明。怎么会有两组声明,一组在数据库中,一组在令牌中?!
非常感谢任何额外的信息。
id_token 应该在客户端使用。您可以使用它来访问客户端的声明。 AccessToken 将在 API.
处使用
要包含在 access_token 中的声明,您需要创建一个包含相关声明的范围,并在请求中请求该范围。 创建范围(在 self-host sample 中将范围添加到 Scopes.cs):
new Scope { Name = "myApiScope", DisplayName = "IdentityManager", Type = ScopeType.Resource, Emphasize = true, ShowInDiscoveryDocument = false, Claims = new List<ScopeClaim> { new ScopeClaim(Constants.ClaimTypes.Name), new ScopeClaim(Constants.ClaimTypes.Role) } }
在授权请求中询问范围(在Javascript implicit client - simple中是这样进行的)
function getToken() {
var authorizationUrl = 'https://localhost:44333/core/connect/authorize';
var client_id = 'implicitclient';
var redirect_uri = 'http://localhost:37045/index.html';
var response_type = "token";
var scope = "myApiScope";
var state = Date.now() + "" + Math.random();
localStorage["state"] = state;
var url =
authorizationUrl + "?" +
"client_id=" + encodeURI(client_id) + "&" +
"redirect_uri=" + encodeURI(redirect_uri) + "&" +
"response_type=" + encodeURI(response_type) + "&" +
"scope=" + encodeURI(scope) + "&" +
"state=" + encodeURI(state);
window.location = url;
}
这将在您的访问令牌中包含名称和角色声明
在 web API 启动中使用相关中间件配置您的 API(在 SampleAspNetWebApi 示例中按如下方式完成)
app.UseIdentityServerBearerTokenAuthentication(新的 IdentityServerBearerTokenAuthenticationOptions { 权限 = "https://localhost:44333/core", RequiredScopes = new[] { "myApiScope" } });
然后您可以按如下方式访问声明
var principal = User as ClaimsPrincipal;
return from c in principal.Identities.First().Claims
select new
{
c.Type,
c.Value
};