91 lines
3.4 KiB
C#
91 lines
3.4 KiB
C#
|
10 months ago
|
using System.Security.Claims;
|
||
|
|
using IdentityModel;
|
||
|
|
using IdentityServer8.Models;
|
||
|
|
using IdentityServer8.Services;
|
||
|
10 months ago
|
using IdentityServer8.Stores;
|
||
|
10 months ago
|
using Microsoft.AspNetCore.Identity;
|
||
|
10 months ago
|
using Microsoft.Extensions.Logging;
|
||
|
10 months ago
|
using Yavsc.Models;
|
||
|
|
|
||
|
|
namespace Yavsc.Services
|
||
|
|
{
|
||
|
10 months ago
|
public class ProfileService : DefaultProfileService, IProfileService
|
||
|
10 months ago
|
{
|
||
|
|
private readonly UserManager<ApplicationUser> _userManager;
|
||
|
|
public ProfileService(
|
||
|
10 months ago
|
UserManager<ApplicationUser> userManager, ILogger<DefaultProfileService> logger) : base(logger)
|
||
|
10 months ago
|
{
|
||
|
|
_userManager = userManager;
|
||
|
|
}
|
||
|
|
|
||
|
10 months ago
|
public async Task<List<Claim>> GetClaimsFromUserAsync(
|
||
|
|
ProfileDataRequestContext context,
|
||
|
|
ApplicationUser user)
|
||
|
10 months ago
|
{
|
||
|
10 months ago
|
var requestedApiResources = context.RequestedResources.Resources.ApiResources.Select(
|
||
|
|
r => r.Name
|
||
|
|
).ToArray();
|
||
|
|
var requestedApiScopes = context.RequestedResources.Resources.ApiScopes.Select(
|
||
|
|
s => s.Name
|
||
|
|
).ToArray();
|
||
|
10 months ago
|
|
||
|
10 months ago
|
var requestedScopes = context.Client.AllowedScopes
|
||
|
|
.Where(s => s != JwtClaimTypes.Subject
|
||
|
|
&& requestedApiScopes.Contains(s))
|
||
|
10 months ago
|
.ToList();
|
||
|
10 months ago
|
|
||
|
|
if (context.RequestedClaimTypes.Contains("profile"))
|
||
|
|
if (requestedScopes.Contains("profile"))
|
||
|
10 months ago
|
{
|
||
|
10 months ago
|
requestedScopes.Remove("profile");
|
||
|
|
requestedScopes.Add(JwtClaimTypes.Name);
|
||
|
|
requestedScopes.Add(JwtClaimTypes.FamilyName);
|
||
|
|
requestedScopes.Add(JwtClaimTypes.Email);
|
||
|
|
requestedScopes.Add(JwtClaimTypes.PreferredUserName);
|
||
|
|
requestedScopes.Add(JwtClaimTypes.Role);
|
||
|
10 months ago
|
}
|
||
|
|
|
||
|
10 months ago
|
var claims = new List<Claim> {
|
||
|
|
new Claim(JwtClaimTypes.Subject,user.Id.ToString()),
|
||
|
|
};
|
||
|
10 months ago
|
if (requestedScopes.Contains(JwtClaimTypes.Name)||
|
||
|
|
requestedScopes.Contains(JwtClaimTypes.FamilyName))
|
||
|
10 months ago
|
{
|
||
|
10 months ago
|
claims.Add(new Claim(JwtClaimTypes.Name, user.FullName));
|
||
|
10 months ago
|
}
|
||
|
10 months ago
|
|
||
|
10 months ago
|
if (requestedScopes.Contains(JwtClaimTypes.PreferredUserName) )
|
||
|
10 months ago
|
{
|
||
|
10 months ago
|
claims.Add(new Claim(JwtClaimTypes.Name, user.UserName));
|
||
|
|
}
|
||
|
|
if (requestedScopes.Contains(JwtClaimTypes.Email))
|
||
|
|
claims.Add(new Claim(JwtClaimTypes.Email, user.Email));
|
||
|
|
|
||
|
|
if (requestedScopes.Contains(JwtClaimTypes.Role))
|
||
|
|
{
|
||
|
|
var roles = await this._userManager.GetRolesAsync(user);
|
||
|
|
if (roles.Count()>0)
|
||
|
|
{
|
||
|
|
claims.Add(new Claim(JwtClaimTypes.Role,String.Join(" ",roles)));
|
||
|
|
}
|
||
|
10 months ago
|
}
|
||
|
10 months ago
|
return claims;
|
||
|
|
}
|
||
|
|
|
||
|
10 months ago
|
override public async Task GetProfileDataAsync(ProfileDataRequestContext context)
|
||
|
10 months ago
|
{
|
||
|
|
var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value;
|
||
|
|
var user = await _userManager.FindByIdAsync(subjectId);
|
||
|
10 months ago
|
context.IssuedClaims = await GetClaimsFromUserAsync(context, user);
|
||
|
10 months ago
|
}
|
||
|
|
|
||
|
10 months ago
|
override public async Task IsActiveAsync(IsActiveContext context)
|
||
|
10 months ago
|
{
|
||
|
|
var subjectId = context.Subject.Claims.FirstOrDefault(c => c.Type == "sub").Value;
|
||
|
|
var user = await _userManager.FindByIdAsync(subjectId);
|
||
|
|
context.IsActive = user != null;
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|