Asp.net mvc 将自定义头值传递给IdentityServer4登录

Asp.net mvc 将自定义头值传递给IdentityServer4登录,asp.net-mvc,authentication,asp.net-core,authorization,identityserver4,Asp.net Mvc,Authentication,Asp.net Core,Authorization,Identityserver4,当用户尝试登录时,我尝试将自定义头值(无cookies)传递给IdentityServer4。下面是它的所有设置 自定义授权属性: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFil

当用户尝试登录时,我尝试将自定义头值(无cookies)传递给IdentityServer4。下面是它的所有设置

自定义授权属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeAttribute : AuthorizeAttribute, IAuthorizationFilter
{
    private readonly string _customId;

    public CustomAuthorizeAttribute(string customId)
    {
        _customId = customId;
    }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        context.HttpContext.Request.Headers.Add("X-CustomId", _customId);
    }
}
控制器:

[CustomAuthorize("0123456789")]
    public IActionResult Secure()
    {
        ViewData["Message"] = "Secure Page.";

        return View();
    }
IdentityServer>AccountControlelr:

[HttpGet]
    public async Task<IActionResult> Login(string returnUrl)
    {
        var customId = _httpContextAccessor.HttpContext.Request.Headers["X-CustomId"];

        // build a model so we know what to show on the login page
        var vm = await BuildLoginViewModelAsync(returnUrl);

        if (vm.IsExternalLoginOnly)
        {
            // we only have one option for logging in and it's an external provider
            return await ExternalLogin(vm.ExternalLoginScheme, returnUrl);
        }

        return View(vm);
    }
[HttpGet]
公共异步任务登录(字符串返回URL)
{
var customId=_httpContextAccessor.HttpContext.Request.Headers[“X-customId”];
//建立一个模型,让我们知道在登录页面上显示什么
var vm=await BuildLoginViewModelAsync(returnUrl);
if(vm.IsExternalLoginOnly)
{
//我们只有一个登录选项,它是一个外部提供者
return wait ExternalLogin(vm.ExternalLoginScheme,returnUrl);
}
返回视图(vm);
}

自定义标头值从未到达任何登录端点。想知道是否有人曾经遇到过这个问题,并有任何想法如何让它工作?非常感谢

您可以将自定义参数传递给授权端点。如果您使用的是OpenID Connect中间件,则可以将值添加到
OnRedirectToIdentityProvider
函数的授权请求查询字符串中:

 services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie("Cookies")

            //hybrid flow
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:62888/";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc2";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
                options.Events.OnRedirectToIdentityProvider = async n =>
                {
                    var headerValue = n.HttpContext.Request.Headers["X-CustomId"];

                    n.ProtocolMessage.SetParameter("X-CustomId", headerValue.ToString());

                    await Task.FromResult(0);
                };
            });
然后在登录页面中,您可以很容易地获得查询字符串:

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {

        var queryString = HttpContext.Request.Query["returnUrl"].ToString();
        // Clear the existing external cookie to ensure a clean login process
        await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }
[HttpGet]
[异名]
公共异步任务登录(字符串returnUrl=null)
{
var queryString=HttpContext.Request.Query[“returnUrl”].ToString();
//清除现有的外部cookie以确保干净的登录过程
等待HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
ViewData[“ReturnUrl”]=ReturnUrl;
返回视图();
}
然后使用
queryString
获取X-CustomId的值:

您可以将自定义参数传递给授权端点。如果您使用的是OpenID Connect中间件,则可以将值添加到
OnRedirectToIdentityProvider
函数的授权请求查询字符串中:

 services.AddAuthentication(options =>
        {
            options.DefaultScheme = "Cookies";
            options.DefaultChallengeScheme = "oidc";
        })
            .AddCookie("Cookies")

            //hybrid flow
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:62888/";
                options.RequireHttpsMetadata = false;

                options.ClientId = "mvc2";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";

                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("api1");
                options.Scope.Add("offline_access");
                options.Events.OnRedirectToIdentityProvider = async n =>
                {
                    var headerValue = n.HttpContext.Request.Headers["X-CustomId"];

                    n.ProtocolMessage.SetParameter("X-CustomId", headerValue.ToString());

                    await Task.FromResult(0);
                };
            });
然后在登录页面中,您可以很容易地获得查询字符串:

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {

        var queryString = HttpContext.Request.Query["returnUrl"].ToString();
        // Clear the existing external cookie to ensure a clean login process
        await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }
[HttpGet]
[异名]
公共异步任务登录(字符串returnUrl=null)
{
var queryString=HttpContext.Request.Query[“returnUrl”].ToString();
//清除现有的外部cookie以确保干净的登录过程
等待HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
ViewData[“ReturnUrl”]=ReturnUrl;
返回视图();
}
然后使用
queryString
获取X-CustomId的值:

我更多的是研究如何将标题值传递给identityserver。现在我想我可能不得不接受你的解决方案。谢谢@Mac,抱歉,你不能使用自定义的头值。我更多的是研究如何将头值传递给identityserver。现在我想我可能不得不接受你的解决方案。谢谢@Mac,抱歉,你不能使用自定义头值。