ASP.NET Core分布式项目实战(Consent Controller Get请求逻辑实现)--学习笔记

2021-01-13 15:38:19 浏览数 (2)

任务20:Consent Controller Get请求逻辑实现

接着上一节的思路,实现一下 ConsentController

根据流程图在构造函数注入 IClientStore,IResourceStore,IIdentityServerInteractionService

构造函数
代码语言:javascript复制
private readonly IClientStore _clientSotre;
private readonly IResourceStore _resourceStore;
private readonly IIdentityServerInteractionService _identityServerInteractionService;

private ConsentController(
    IClientStore clientStore,
    IResourceStore resourceStore,
    IIdentityServerInteractionService identityServerInteractionService)
{
    _clientSotre = clientStore;
    _resourceStore = resourceStore;
    _identityServerInteractionService = identityServerInteractionService;
}
Index
代码语言:javascript复制
public IActionResult Index(string returnUrl)
{
    var model = BuildConsentViewModel(returnUrl);

    if (model == null)
    {

    }

    return View(model);
}
BuildConsentViewModel
代码语言:javascript复制
private async Task<ConsentViewModel> BuildConsentViewModel(string returnUrl)
{
    var request = await _identityServerInteractionService.GetAuthorizationContextAsync(returnUrl);
    if (request == null)
        return null;

    var client = await _clientSotre.FindEnabledClientByIdAsync(request.ClientId);
    var resources = await _resourceStore.FindEnabledResourcesByScopeAsync(request.ScopesRequested);

    return CreateConsentViewModel(request, client, resources);
}
CreateConsentViewModel
代码语言:javascript复制
private ConsentViewModel CreateConsentViewModel(AuthorizationRequest request, Client client, Resources resources)
{
    var vm = new ConsentViewModel();
    vm.ClientName = client.ClientName;
    vm.ClientLogoUrl = client.LogoUri;
    vm.ClientUrl = client.ClientUri;
    vm.AllowRemeberConsent = client.AllowRememberConsent;
    vm.IdentityScopes = resources.IdentityResources.Select(i => CreateScopeViewModel(i));
    vm.ResourceScopes = resources.ApiResources.SelectMany(i => i.Scopes).Select(x => CreateScopeViewModel(x));

    return vm;
}

在获取 vm.ResourceScopes 的时候我们用到了 SelectMany,如果我们使用 resources.ApiResources.Select 的话,我们会得到一个 List<List>,而我们想要得到的是一个 List,所以通过 SelectMany 会把 List<List> 展开得到里面的每一个 List

CreateScopeViewModel
代码语言:javascript复制
private ScopeViewModel CreateScopeViewModel(IdentityResource identityResource)
{
    return new ScopeViewModel
    {
        Name = identityResource.Name,
        DisplayName = identityResource.DisplayName,
        Description = identityResource.Description,
        Required = identityResource.Required,
        Checked = identityResource.Required,
        Emphasize = identityResource.Emphasize,
    };
}

private ScopeViewModel CreateScopeViewModel(Scope scope)
{
    return new ScopeViewModel
    {
        Name = scope.Name,
        DisplayName = scope.DisplayName,
        Description = scope.Description,
        Required = scope.Required,
        Checked = scope.Required,
        Emphasize = scope.Emphasize,
    };
}
ConsentViewModel 添加 ClientUrl
代码语言:javascript复制
public string ClientUrl { get; set; }
ScopeViewModel 修改字段类型为 bool
代码语言:javascript复制
public bool Emphasize { get; set; }
public bool Required { get; set; }

课程链接

http://video.jessetalk.cn/course/explore

0 人点赞