context.ActionDescriptor?.MethodInfo.Name == "Login" 没有这个属性MethodInfo
时间: 2024-12-06 19:33:26 浏览: 17
对不起,看起来我的描述有些混淆。在.NET Core中,`ActionDescriptor` 类确实没有 `MethodInfo.Name` 属性。实际上,对于控制器方法,你可以通过其他方式获取方法名。你可以使用 `ActionDescriptor.ActionName` 来得到控制器方法的名称,而不是 `MethodInfo.Name`。修正后的代码应该像这样:
```csharp
if (context.ActionDescriptor is ControllerMethodDescriptor methodDescriptor && methodDescriptor.DisplayName == "Login")
{
if (!_cookieService.HasLoginCookie("YourCookieName"))
{
context.Result = new RedirectResult("/", true); // 跳转到首页
}
else
{
base.OnActionExecuting(context);
}
}
```
这里假设 `DisplayName` 属性包含了你要查找的登录方法名。如果你有明确的属性名代表方法名,请使用相应的属性。
相关问题
NET8 IAuthorizationFilter 自定义认证 没有ActionDescriptor.GetCustomAttributes
.NET Core 8 中的 `IAuthorizationFilter` 是用于自定义授权的一个特性,它允许你在 ASP.NET Core 应用中实现自己的访问控制策略。通常情况下,你可以通过继承 `AuthorizationFilterBase` 并实现 `OnAuthorization` 方法来实现过滤器。
然而,当尝试在 `IAuthorizationFilter` 上查找 `ActionDescriptor.GetCustomAttributes` 时,可能会遇到该方法不存在的问题。这是因为 `ActionDescriptor.GetCustomAttributes` 是 ASP.NET Core MVC 的内部 API,它可能不是所有框架组件都公开提供的,特别是对于基础的认证和授权服务。
如果你需要获取 Action 属性(如 `[Authorize]` 或 `[ValidateAntiForgeryToken]` 等),建议在 MVC 中使用 `Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext` 类,并从其中的 `ActionDescriptor` 对象上获取这些信息。例如:
```csharp
public class CustomAuthorizationFilter : AuthorizationFilterAttribute
{
public override void OnAuthorization(AuthorizationFilterContext context)
{
// 获取当前 ActionDescriptor 上的所有属性
var attributes = context.ActionDescriptor.GetCustomAttributes<YourCustomAttribute>();
// ... 进行进一步的处理,比如检查授权、记录日志等
}
}
```
在这个例子中,你需要替换 `YourCustomAttribute` 为你要查询的实际自定义属性类型。
.net core怎么判断进入login页面的时候如果cookie存在就进入首页,不存在就自动跳使用过滤器
在.NET Core中,你可以使用中间件(Middleware)和依赖注入(DI)结合Cookie服务来实现这个功能。当你想要在用户访问登录页时检查是否存在Cookie,然后决定是否转向首页,可以创建一个自定义的过滤器FilterAttribute。下面是一个简单的步骤:
1. 首先,创建一个`ICookieService`接口,用于操作Cookie。
```csharp
public interface ICookieService
{
bool HasLoginCookie(string cookieName);
}
```
2. 实现该接口的服务,如`CookieService.cs`:
```csharp
public class CookieService : ICookieService
{
private readonly IHttpContextAccessor _httpContextAccessor;
public CookieService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public bool HasLoginCookie(string cookieName)
{
var context = _httpContextAccessor.HttpContext;
return context.Request.Cookies.ContainsKey(cookieName);
}
}
```
3. 创建一个基于此接口的过滤器类`LoginRedirectIfCookieExistsAttribute.cs`:
```csharp
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class LoginRedirectIfCookieExistsAttribute : ActionFilterAttribute
{
private readonly ICookieService _cookieService;
public LoginRedirectIfCookieExistsAttribute(ICookieService cookieService)
{
_cookieService = cookieService;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (context.ActionDescriptor?.MethodInfo.Name == "Login" && !_cookieService.HasLoginCookie("YourCookieName"))
{
context.Result = new RedirectResult("/", true); // 跳转到首页
}
else
{
base.OnActionExecuting(context);
}
}
}
```
4. 将`LoginRedirectIfCookieExistsAttribute`注册到控制器或需要应用的地方,并配置DI。
5. 现在,当你试图访问非登录页面(比如主页)时,如果检测到`YourCookieName`的Cookie存在,则会直接导向首页;如果没有,才会继续执行登录动作。
注意:替换`"YourCookieName"`为你实际使用的Cookie名称。
阅读全文