简体   繁体   English

没有为方案“Cookies”注册身份验证处理程序。 注册的方案有:Application、Bearer、ASOS

[英]No authentication handler is registered for the scheme 'Cookies'. The registered schemes are: Application, Bearer, ASOS

I am implementing Aspnet.security.openidconnect (ASOS) with .net core 2.1 application.我正在使用 .net core 2.1 应用程序实现 Aspnet.security.openidconnect (ASOS)。 Now the issue is when I am trying to execute this chunk in controller,现在的问题是当我试图在控制器中执行这个块时,

        public async Task<IActionResult> Authorize()
        {
            if (Response.StatusCode != 200)
            {
                return View("AuthorizeError");
            }

            var ticket = await AuthenticationHttpContextExtensions.AuthenticateAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme);
            var identity = ticket != null && ticket.Principal != null ? ticket.Ticket.Principal : null;
            if (identity == null)
            {
                await AuthenticationHttpContextExtensions.ChallengeAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme, null);
                return Unauthorized();
            }
            ViewData["Name"] = ticket.Principal.Identity.Name;
           var scopes = (HttpContext.Request.Query["scope"].ToString() ?? "").Split(' ');
            ViewData["Scopes"] = scopes;

            //var claimsIdentity = new ClaimsIdentity(identity.Claims, "Bearer", identity.NameClaimType, identity.RoleClaimType);
            var claimsIdentity = new ClaimsIdentity(identity.Claims, "Bearer");
            foreach (var scope in scopes)
            {
                claimsIdentity.AddClaim(new Claim("urn:oauth:scope", scope));
            }
            var claimsPrincipal = new ClaimsPrincipal(claimsIdentity);
            await AuthenticationHttpContextExtensions.SignInAsync(HttpContext, claimsPrincipal);
            logger.Info("Authorize request received");
            return View();
        }

The error I am getting on this line:我在这条线上遇到的错误:

 var ticket = await AuthenticationHttpContextExtensions.AuthenticateAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme);

And here is the implementation of ASOS in startup:这是 ASOS 在启动时的实现:

            services.Configure<CookiePolicyOptions>(options =>
            {
                // This lambda determines whether user consent for non-essential cookies is needed for a given request.
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                   .AddCookie("Application", options =>
                   {
                       options.LoginPath = new PathString(LoginPath);
                       options.LogoutPath = new PathString(LogoutPath);
                       options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

                       //options.AccessDeniedPath = new PathString(); 
                   });

            //services.AddAuthentication("External")
            // .AddCookie("Cookies", options =>
            // {
            //     options.Cookie.Name = CookieAuthenticationDefaults.CookiePrefix + "External";
            //     options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
            // });

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie();

            services.AddAuthentication(OAuthValidationDefaults.AuthenticationScheme).AddOAuthValidation()
            .AddOpenIdConnectServer(options =>
            {
                options.AuthorizationEndpointPath = new PathString(AuthorizePath);
                // Enable the token endpoint.
                options.TokenEndpointPath = new PathString(TokenPath);
                options.ApplicationCanDisplayErrors = true;
                options.AccessTokenLifetime = TimeSpan.FromMinutes(5);
#if DEBUG
                 options.AllowInsecureHttp = true;
#endif
                options.Provider.OnValidateAuthorizationRequest = context =>
                {
                    if (string.Equals(context.ClientId, Configuration["OpenIdServer:ClientId"], StringComparison.Ordinal))
                    {
                        context.Validate(context.RedirectUri);
                    }
                    return Task.CompletedTask;
                };
                // Implement OnValidateTokenRequest to support flows using the token endpoint.
                options.Provider.OnValidateTokenRequest = context =>
                {
                // Reject token requests that don't use grant_type=password or grant_type=refresh_token.
                if (!context.Request.IsClientCredentialsGrantType() && !context.Request.IsPasswordGrantType()
                    && !context.Request.IsRefreshTokenGrantType())
                    {
                       context.Reject(
                       error: OpenIdConnectConstants.Errors.UnsupportedGrantType,
                       description: "Only grant_type=password and refresh_token " +
                                    "requests are accepted by this server.");

                        return Task.CompletedTask;
                    }

                    if (string.IsNullOrEmpty(context.ClientId))
                    {
                        context.Skip();

                        return Task.CompletedTask;
                    }

                    if (string.Equals(context.ClientId, Configuration["OpenIdServer:ClientId"], StringComparison.Ordinal) &&
                        string.Equals(context.ClientSecret, Configuration["OpenIdServer:ClientSecret"], StringComparison.Ordinal))
                    {
                        context.Validate();
                    }

                    return Task.CompletedTask;
                };

                // Implement OnHandleTokenRequest to support token requests.
                options.Provider.OnHandleTokenRequest = context =>
                {
                 // Only handle grant_type=password token requests and let
                 // the OpenID Connect server handle the other grant types.
                  if (context.Request.IsClientCredentialsGrantType() || context.Request.IsPasswordGrantType())
                  {
                     //var identity = new ClaimsIdentity(context.Scheme.Name,
                     //    OpenIdConnectConstants.Claims.Name,
                     //    OpenIdConnectConstants.Claims.Role);
                     ClaimsIdentity identity = null;
                        if (context.Request.IsClientCredentialsGrantType())
                        {
                            identity = new ClaimsIdentity(new GenericIdentity(context.Request.ClientId, "Bearer"), context.Request.GetScopes().Select(x => new Claim("urn:oauth:scope", x)));
                        }
                        else if (context.Request.IsPasswordGrantType())
                        {
                            identity = new ClaimsIdentity(new GenericIdentity(context.Request.Username, "Bearer"), context.Request.GetScopes().Select(x => new Claim("urn:oauth:scope", x)));
                        }


                        // Add the mandatory subject/user identifier claim.
                        // By default, claims are not serialized in the access/identity tokens.
                        // Use the overload taking a "destinations" parameter to make sure
                        // your claims are correctly inserted in the appropriate tokens.
                        identity.AddClaim(OpenIdConnectConstants.Claims.Subject, Guid.NewGuid().ToString("n") + Guid.NewGuid().ToString("n"), OpenIdConnectConstants.Destinations.AccessToken, OpenIdConnectConstants.Destinations.IdentityToken);


                        var ticket = new Microsoft.AspNetCore.Authentication.AuthenticationTicket(
                         new ClaimsPrincipal(identity),
                         new Microsoft.AspNetCore.Authentication.AuthenticationProperties(),
                         context.Scheme.Name);

                     // Call SetScopes with the list of scopes you want to grant
                     // (specify offline_access to issue a refresh token).
                     ticket.SetScopes(
                         OpenIdConnectConstants.Scopes.Profile,
                         OpenIdConnectConstants.Scopes.OfflineAccess);

                        context.Validate(ticket);
                   }

                   return Task.CompletedTask;
                };

Now the error I am getting is:现在我得到的错误是:

InvalidOperationException: No authentication handler is registered for the scheme 'Cookies'. InvalidOperationException:没有为方案“Cookies”注册身份验证处理程序。 The registered schemes are: Application, Bearer, ASOS.注册的方案有:Application、Bearer、ASOS。 Did you forget to call AddAuthentication().AddSomeAuthHandler?您是否忘记调用 AddAuthentication().AddSomeAuthHandler?

What am I missing here.我在这里想念什么。 Any help?有什么帮助吗?

So found the issue, actually I was using "Application" name for cookie scheme and in controller I was using default name "Cookies".所以发现了问题,实际上我使用的是“应用程序”名称作为 cookie 方案,而在控制器中我使用的是默认名称“Cookies”。 So just had to remove the explicit "Application" name to default "Cookies" name No authenticationScheme was specified, and there was no DefaultChallengeScheme found Cookies Authentication所以只需要将显式的“应用程序”名称删除为默认的“Cookies”名称没有指定 authenticationScheme,也没有找到 DefaultChallengeScheme Cookies Authentication

In my case I was using "Cookies" when adding authentication and "Cookie" when calling the SiginOut method.在我的情况下,我在添加身份验证时使用“Cookies”,在调用 SiginOut 方法时使用“Cookie”。 Changed both the places to use "Cookies"将两个地方都更改为使用“Cookies”

Startup:启动:

services.AddAuthentication(config => {
                config.DefaultScheme = "Cookies";
                config.DefaultChallengeScheme = "oidc";
            })
                .AddCookie("Cookies")<---- Change here.
                .AddOpenIdConnect("oidc", config => {
                    config.Authority = "https://localhost:44392/";
                    config.ClientId = "client_id_mvc";
                    config.ClientSecret = "client_secret_mvc";
                    config.SaveTokens = true;
                    config.ResponseType = "code";
                    //config.SignedOutCallbackPath = "/Privacy";

                });

Calling SignOut:呼叫注销:

public async Task<IActionResult> OnPostAsync()
    {
        return SignOut("Cookies", "oidc");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 InvalidOperationException:没有为方案承载注册身份验证处理程序。 - InvalidOperationException: No authentication handler is registered for the scheme Bearer. 找不到与绑定BasicHttpBinding的端点匹配方案https的基地址。 注册的基址方案是http - Could not find a base address that matches scheme https for the endpoint with binding BasicHttpBinding. Registered base address schemes are http 报告查看器 Web 控件 HTTP 处理程序尚未在应用程序的 web.config 文件中注册 - The Report Viewer Web Control HTTP Handler has not been registered in the application's web.config file 未在应用程序的web.config文件中注册的Report Viewer Web Control HTTP处理程序 - The Report Viewer Web Control HTTP Handler not registered in the application's web.config file 没有配置身份验证处理程序来处理该方案 - No authentication handler is configured to handle the scheme ASP.NET Core 3 没有为该方案注册登录管理器 - ASP.NET Core 3 No Sign-In Manager Is Registered for the Scheme 如何解决“报告查看器 Web 控件 HTTP 处理程序尚未在应用程序的 web.config 文件中注册” - How to resolve "The Report Viewer Web Control HTTP Handler has not been registered in the application's web.config file" 在应用程序级别之外注册为allowDefinition =&#39;MachineToApplication&#39;的部分 - section registered as allowDefinition='MachineToApplication' beyond application level 没有为.NET Core Kestrel应用程序注册任何服务 - No service registered for .NET Core Kestrel application Ninject no kernel 已为 web 应用程序注册 - Ninject no kernel has been registered for the web application
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM