网站首页 网站源码
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("撤销授权成功"));
}
}
上述代码是一个 ASP.NET Core 控制器,名为 AuthorizationManageController,用于管理用户授权的相关操作。它主要涉及到用户的授权信息、应用程序的管理以及撤销授权的功能。以下是对代码中各个部分的详细解释:
[Authorize] 特性,表示该控制器中的所有操作都需要用户进行身份验证。OpenIddictAuthorizationManager、IRepository<DpzAuthorization>、IRepository<DpzApplication> 和 IPinCodeValidator,这些依赖项用于处理授权、数据库操作和验证码验证。Index 方法Index 方法用于获取当前用户的授权应用程序列表。account),如果用户未登录,则返回一个空的应用程序列表。AuthApplicationModel 对象列表,最后按显示名称排序并返回视图。Page 方法Page 方法用于分页获取用户的授权记录。PageAuthorizationModel 对象列表,并返回 JSON 格式的分页结果。Revoke 方法Revoke 方法用于撤销用户的授权。pinCodeValidator 验证用户提供的验证码。openIddictAuthorizationManager.RevokeAsync 方法撤销用户的授权,并返回成功的 JSON 响应。整体而言,AuthorizationManageController 提供了一个用于管理用户授权的接口,包括查看用户的授权应用程序、分页查询授权记录以及撤销授权的功能。它通过依赖注入的方式使用了多个服务和仓储,以实现与数据库的交互和业务逻辑的处理。
