相关疑难解决方法(0)

AllowAnonymous不使用Custom AuthorizationAttribute

这让我难以忍受了一段时间.通常遇到的类似情况似乎都不适用于此.我可能错过了一些明显但我看不到的东西.

在我的Mvc Web应用程序中,我使用Authorize和AllowAnonymous属性,这样您就必须明确地将操作打开为公开可用,而不是锁定站点的安全区域.我更喜欢这种方法.但是,我无法在WebAPI中获得相同的行为.

我编写了一个自定义的授权属性,它继承自System.Web.Http.AuthorizeAttribute,具有以下内容:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class MyAuthorizationAttribute : System.Web.Http.AuthorizeAttribute
Run Code Online (Sandbox Code Playgroud)

我将此注册为过滤器:

    public static void RegisterHttpFilters(HttpFilterCollection filters)
    {
        filters.Add(new MyAuthorizationAttribute());
    }
Run Code Online (Sandbox Code Playgroud)

这一切都按预期工作,没有凭据就不再提供操作.问题是现在以下方法不允许AllowAnonymous属性执行此操作:

[System.Web.Http.AllowAnonymous]
public class HomeController : ApiController
{
    [GET("/"), System.Web.Http.HttpGet]
    public Link[] Index()
    {
        return new Link[] 
        { 
            new SelfLink(Request.RequestUri.AbsoluteUri, "api-root"),
            new Link(LinkRelConstants.AuthorizationEndpoint, "OAuth/Authorize/", "authenticate"),
            new Link(LinkRelConstants.AuthorizationTokenEndpoint , "OAuth/Tokens/", "auth-token-endpoint")
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

最常见的情况似乎是将两个Authorize/AllowAnonymous属性混淆.System.Web.Mvc适用于Web应用程序,System.Web.Http适用于WebAPI(无论如何我都理解).

我正在使用的两个属性来自相同的命名空间--System.Web.Http.我假设这将继承基本功能,并允许我在OnAuthotize方法中注入我需要的代码.

根据文档,AllowAnonymous属性在我立即调用的OnAuthorize方法内部工作:

    public override void OnAuthorization(HttpActionContext actionContext)
    {
        base.OnAuthorization(actionContext);
Run Code Online (Sandbox Code Playgroud)

任何想法都会非常感激.

有没有人遇到过这个问题,找到根本原因?

authentication asp.net-mvc attributes asp.net-web-api

51
推荐指数
3
解决办法
3万
查看次数

自定义 AuthenticationHandler 在 Asp.Net Core 3 中不起作用

我不确定在 Asp.Net Core 2.2 中是否会发生同样的情况,但是当我升级到最新的 Asp.net Core 3 版本时会发生这种情况。所以,我的问题是我创建了AuthenticationHandler如下自定义:

public class PlatformAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public PlatformAuthenticationHandler(
        IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, 
        UrlEncoder encoder,
        ISystemClock clock) 
        : base(options, logger, encoder, clock)
    {
    }

    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var sessionTokenStr = Request.Headers[Headers.SessionToken];
        var userTokenStr = Request.Headers[Headers.UserToken];

        if (string.IsNullOrEmpty(sessionTokenStr) ||
            Guid.TryParse(sessionTokenStr, out var sessionToken))
        {
            return AuthenticateResult.Fail("Session token should be present and in GUID format");
        }

        if (string.IsNullOrEmpty(userTokenStr) ||
            Guid.TryParse(userTokenStr, out var userToken))
        { 
            return AuthenticateResult.Fail("User token should be …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core asp.net-core-3.0

7
推荐指数
1
解决办法
6018
查看次数