Asp.net mvc 将自定义头值传递给IdentityServer4登录
当用户尝试登录时,我尝试将自定义头值(无cookies)传递给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
[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,抱歉,你不能使用自定义头值。