Я работаю над приложением MVC asp.net с сервером идентификации 4 в качестве службы токенов. У меня тоже есть api, у которого есть некоторые защищенные ресурсы. Я хочу реализовать роли (авторизация) для api. Я хочу убедиться, что только авторизованный ресурс с действительной ролью может получить доступ к конечной точке api, в противном случае получить 401 (несанкционированная ошибка).реализация ролей на сервере идентификации 4 с идентификатором asp.net
Вот мои конфигурации:
Клиентские
new Client()
{
ClientId = "mvcClient",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
ClientSecrets = new List<Secret>()
{
new Secret("secret".Sha256())
},
RequireConsent = false;
// where to redirect to after login
RedirectUris = { "http://localhost:5002/signin-oidc" },
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5002" },
AllowedScopes =
{
StandardScopes.OpenId.Name,
StandardScopes.Profile.Name,
StandardScopes.OfflineAccess.Name,
StandardScopes.Roles.Name,
"API"
}
}
Прицелы
return new List<Scope>()
{
StandardScopes.OpenId, // subject id
StandardScopes.Profile, // first name, last name
StandardScopes.OfflineAccess, // requesting refresh tokens for long lived API access
StandardScopes.Roles,
new Scope()
{
Name = "API",
Description = "API desc",
Type = ScopeType.Resource,
Emphasize = true,
IncludeAllClaimsForUser = true,
Claims = new List<ScopeClaim>
{
new ScopeClaim(ClaimTypes.Name),
new ScopeClaim(ClaimTypes.Role)
}
}
};
Пользователь
new InMemoryUser()
{
Subject = "1",
Username = "testuser",
Password = "password",
Claims = new List<Claim>()
{
new Claim("name", "Alice"),
new Claim("Website", "http://alice.com"),
new Claim(JwtClaimTypes.Role, "admin")
}
}
и в запуске сервера я прибавил:
services.AddIdentityServer() .AddTemporarySigningCredential() .AddSigningCredential (серт) .AddInMemoryClients (Config.GetClients()) .AddInMemoryScopes (Config.GetScopes()) .AddInMemoryUsers (Config.GetUsers())
в запуске апи, у меня есть это:
app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions()
{
Authority = "http://localhost:5000",
ScopeName = "NamfusAPI",
RequireHttpsMetadata = false
});
в контроллере апи, у меня есть это:
[Authorize(Roles = "admin")]
public IActionResult Get()
{
return new JsonResult(from c in User.Claims select new {c.Type, c.Value });
}
в запуске клиента MVC, у меня есть это:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
AuthenticationScheme = "Cookies"
});
var oidcOptions = new OpenIdConnectOptions()
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
Authority = "http://localhost:5000",
RequireHttpsMetadata = false,
ClientId = "mvcClient",
ClientSecret = "secret",
SaveTokens = true,
GetClaimsFromUserInfoEndpoint = true,
ResponseType = "code id_token", // hybrid flow
};
oidcOptions.Scope.Clear();
oidcOptions.Scope.Add("openid");
oidcOptions.Scope.Add("profile");
oidcOptions.Scope.Add("NamfusAPI");
oidcOptions.Scope.Add("offline_access");
oidcOptions.Scope.Add("roles");
Я пытаюсь вызвать апи так:
public async Task<IActionResult> CallApiUsingUserAccessToken()
{
var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");
var client = new HttpClient();
client.SetBearerToken(accessToken);
var content = await client.GetStringAsync("http://localhost:5001/identity");
ViewBag.Json = JArray.Parse(content).ToString();
return View("json");
}
Я получаю токен доступа, но когда вы вызываете api (identity/get), я получаю ошибку 302 Forbidden (в хромовой сети она показывает 500 внутренних ошибок сервера). Если изменить API атрибут Авторизовать из
[Authorize(Roles = "admin")]
public IActionResult Get()
к (без роли):
[Authorize]
public IActionResult Get()
это работает, и я получаю данные из API в приложении MVC. Как я могу применять роли в этом коде.
Просьба предложить.
уверен, что вы не должны делать как 'AddTemporarySigningCredential()' и 'AddSigningCredential (CERT)'? –