网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
using Dpz.Core.Auth.Models;
using Dpz.Core.Auth.Service;
using Dpz.Core.EnumLibrary;
using Dpz.Core.Infrastructure;
using Dpz.Core.MongodbAccess;
using Dpz.Core.Public.Entity.Auth;
using Dpz.Core.Service;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Bson;
using MongoDB.Driver;
using OpenIddict.Core;

namespace Dpz.Core.Auth.Controllers;

[Authorize(nameof(Permissions.System))]
public class AuthorizationManageController(
    OpenIddictAuthorizationManager<DpzAuthorization> openIddictAuthorizationManager,
    IRepository<DpzAuthorization> authorizationRepository,
    IRepository<DpzApplication> dpzApplicationRepository,
    IPinCodeValidator pinCodeValidator
) : Controller
{
    public async Task<IActionResult> Index()
    {
        var account = User.NameIdentifier;
        if (string.IsNullOrWhiteSpace(account))
        {
            return View(new List<AuthApplicationModel>());
        }

        var subjectFilter = Builders<DpzAuthorization>.Filter.Eq(x => x.Subject, account);
        var applicationIds = await authorizationRepository
            .SearchFor(subjectFilter)
            .Project(x => x.ApplicationId)
            .ToListAsync();

        var applications = await dpzApplicationRepository
            .SearchFor(Builders<DpzApplication>.Filter.In(x => x.Id, applicationIds))
            .ToListAsync();

        var result = applications
            .Select(x => new AuthApplicationModel(x.Id.ToString(), x.ClientId, x.DisplayName))
            .OrderBy(x => x.DisplayName, StringComparer.OrdinalIgnoreCase)
            .ToList();

        return View(result);
    }

    [HttpGet]
    public async Task<IActionResult> Page(
        string? applicationId = null,
        string? status = null,
        string? type = null,
        string? keyword = null,
        int page = 1,
        int limit = 10
    )
    {
        if (page < 1)
        {
            page = 1;
        }
        if (limit < 1)
        {
            limit = 1;
        }

        var account = User.NameIdentifier;
        if (string.IsNullOrWhiteSpace(account))
        {
            return Json(new LayuiPageWarp<PageAuthorizationModel>());
        }

        var query = authorizationRepository.SearchFor(x => x.Subject == account);

        if (
            !string.IsNullOrWhiteSpace(applicationId)
            && ObjectId.TryParse(applicationId, out var appId)
        )
        {
            query = query.Where(x => x.ApplicationId == appId);
        }

        if (!string.IsNullOrWhiteSpace(status))
        {
            query = query.Where(x => x.Status == status);
        }

        if (!string.IsNullOrWhiteSpace(type))
        {
            query = query.Where(x => x.Type == type);
        }

        if (!string.IsNullOrWhiteSpace(keyword))
        {
            keyword = keyword.Trim();
            query = query.Where(x =>
                (x.Status != null && x.Status.Contains(keyword))
                || (x.Type != null && x.Type.Contains(keyword))
                || (x.Scopes != null && x.Scopes.Any(scope => scope.Contains(keyword)))
            );
        }

        var pagedList = await query
            .OrderByDescending(x => x.CreationDate)
            .ToPagedListAsync(page, limit);

        var pageAppIds = pagedList.Select(x => x.ApplicationId).ToHashSet();
        var applications = await dpzApplicationRepository
            .SearchFor(Builders<DpzApplication>.Filter.In(x => x.Id, pageAppIds))
            .Project(x => new { x.Id, x.DisplayName })
            .ToListAsync();

        var data = pagedList
            .Select(x =>
            {
                var app = applications.FirstOrDefault(y => y.Id == x.ApplicationId);
                return new PageAuthorizationModel
                {
                    Id = x.Id.ToString(),
                    ApplicationId = x.ApplicationId.ToString(),
                    ApplicationName = app?.DisplayName ?? string.Empty,
                    Status = x.Status,
                    StatusName = AuthHelper.GetAuthorizationDescription(x.Status),
                    Type = x.Type,
                    TypeName = AuthHelper.GetAuthorizationDescription(x.Type),
                    CreationDate = x.CreationDate,
                    Scopes = x.Scopes?.ToList() ?? [],
                };
            })
            .ToList();

        return Json(new LayuiPageWarp<PageAuthorizationModel>(data, pagedList.TotalItemCount));
    }

    [HttpPost]
    public async Task<IActionResult> Revoke(RevokeAuthorizationModel model)
    {
        var account = User.NameIdentifier;
        if (string.IsNullOrWhiteSpace(account))
        {
            return Json(ResponseResult.ToFail("用户未登录"));
        }

        var (success, message) = await pinCodeValidator.ValidateAsync(account, model.PinCode);
        if (!success)
        {
            return Json(ResponseResult.ToFail(message));
        }

        await openIddictAuthorizationManager.RevokeAsync(
            account,
            model.ApplicationId,
            model.Status,
            model.Type
        );
        return Json(ResponseResult.ToSuccess("撤销授权成功"));
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个 ASP.NET Core 控制器,名为 AuthorizationManageController,用于管理用户授权的相关操作。它主要涉及到用户的授权信息、应用程序的管理以及撤销授权的功能。以下是对代码中各个部分的详细解释:

1. 控制器的基本结构

  • 控制器使用了 [Authorize] 特性,表示该控制器中的所有操作都需要用户进行身份验证。
  • 控制器的构造函数接受多个依赖项,包括 OpenIddictAuthorizationManagerIRepository<DpzAuthorization>IRepository<DpzApplication>IPinCodeValidator,这些依赖项用于处理授权、数据库操作和验证码验证。

2. Index 方法

  • Index 方法用于获取当前用户的授权应用程序列表。
  • 它首先获取当前用户的标识(account),如果用户未登录,则返回一个空的应用程序列表。
  • 然后,它通过用户的标识查询数据库,获取与该用户相关的所有授权记录,并提取出应用程序 ID。
  • 接着,它根据这些应用程序 ID 查询应用程序的详细信息,并将结果转换为 AuthApplicationModel 对象列表,最后按显示名称排序并返回视图。

3. Page 方法

  • Page 方法用于分页获取用户的授权记录。
  • 它接受多个查询参数,包括应用程序 ID、状态、类型、关键字、页码和每页限制。
  • 方法首先确保页码和限制的有效性,然后获取当前用户的标识。
  • 接着,它构建一个查询,基于用户的标识和其他可选参数(如应用程序 ID、状态、类型和关键字)过滤授权记录。
  • 查询结果按创建日期降序排列,并进行分页处理。
  • 最后,它将授权记录与应用程序信息结合,构建 PageAuthorizationModel 对象列表,并返回 JSON 格式的分页结果。

4. Revoke 方法

  • Revoke 方法用于撤销用户的授权。
  • 它首先获取当前用户的标识,如果用户未登录,则返回失败的 JSON 响应。
  • 然后,它使用 pinCodeValidator 验证用户提供的验证码。
  • 如果验证码验证失败,则返回相应的失败消息。
  • 如果验证成功,调用 openIddictAuthorizationManager.RevokeAsync 方法撤销用户的授权,并返回成功的 JSON 响应。

总结

整体而言,AuthorizationManageController 提供了一个用于管理用户授权的接口,包括查看用户的授权应用程序、分页查询授权记录以及撤销授权的功能。它通过依赖注入的方式使用了多个服务和仓储,以实现与数据库的交互和业务逻辑的处理。

loading