ASP.net C# webform ADFS 遇到 CORS 错误
ASP.net C# webform ADFS hitting CORS error
当我想重定向到 webform 中的 ADFS 服务器时,我一直遇到 CORS 错误。
以下是我遇到的错误:
我尝试了下面提到的几种方法 link:
但是,没有任何效果。不确定我是否遗漏了 ADFS 设置中的任何内容?
在我使用 MVC 的其他项目中,它运行良好。只是网络表单不断出现此错误。
Login.aspx.cs
protected void LoginSSO(object sender, EventArgs e)
{
Response.AppendHeader("Access-Control-Allow-Origin", "*");
Response.AppendHeader("Access-Control-Allow-Methods", "*");
ExternalLogin bUsr = new ExternalLogin();
HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
var translator = new ActionResultTranslator(contextWrapper);
translator.Execute(bUsr.ExternalLoginADFS("ExternalLoginCallback.aspx"));
}
外部Login.aspx.cs
public partial class ExternalLogin : System.Web.UI.Page
{
private const string XsrfKey = "XsrfId";
public string RedirectUri { get; private set; }
[AllowAnonymous]
public ActionResult ExternalLoginADFS(string returnUrl)
{
return new ChallengeResult(WsFederationAuthenticationDefaults.AuthenticationType, "ExternalLoginCallback.aspx");
}
[HttpPost]
[AllowAnonymous]
public ActionResult ExternalLoginADFS(string provider, string returnUrl)
{
return new ChallengeResult(provider, "ExternalLoginCallback.aspx");
}
internal class ChallengeResult : HttpUnauthorizedResult
{
public ChallengeResult(string provider, string redirectUri)
: this(provider, redirectUri, null)
{
}
public ChallengeResult(string provider, string redirectUri, string userId)
{
LoginProvider = provider;
RedirectUri = redirectUri;
UserId = userId;
}
public string LoginProvider { get; set; }
public string RedirectUri { get; set; }
public string UserId { get; set; }
public Task<ActionResult> Task { get; }
public class ActionResultTranslator
{
HttpContextBase _context;
public ActionResultTranslator(HttpContextBase context)
{
_context = context;
}
[HttpGet]
public void Execute(ActionResult actionResult)
{
ControllerContext fakeContext = new ControllerContext();
fakeContext.HttpContext = _context;
actionResult.ExecuteResult(fakeContext);
}
}
[HttpGet]
public override void ExecuteResult(ControllerContext context)
{
var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
if (UserId != null)
{
properties.Dictionary[XsrfKey] = UserId;
}
context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
}
}
}
我找到了解决方案。
解决方案:
运行 启用它的 PowerShell 脚本
当我想重定向到 webform 中的 ADFS 服务器时,我一直遇到 CORS 错误。 以下是我遇到的错误:
我尝试了下面提到的几种方法 link:
但是,没有任何效果。不确定我是否遗漏了 ADFS 设置中的任何内容? 在我使用 MVC 的其他项目中,它运行良好。只是网络表单不断出现此错误。
Login.aspx.cs
protected void LoginSSO(object sender, EventArgs e)
{
Response.AppendHeader("Access-Control-Allow-Origin", "*");
Response.AppendHeader("Access-Control-Allow-Methods", "*");
ExternalLogin bUsr = new ExternalLogin();
HttpContextWrapper contextWrapper = new HttpContextWrapper(this.Context);
var translator = new ActionResultTranslator(contextWrapper);
translator.Execute(bUsr.ExternalLoginADFS("ExternalLoginCallback.aspx"));
}
外部Login.aspx.cs
public partial class ExternalLogin : System.Web.UI.Page
{
private const string XsrfKey = "XsrfId";
public string RedirectUri { get; private set; }
[AllowAnonymous]
public ActionResult ExternalLoginADFS(string returnUrl)
{
return new ChallengeResult(WsFederationAuthenticationDefaults.AuthenticationType, "ExternalLoginCallback.aspx");
}
[HttpPost]
[AllowAnonymous]
public ActionResult ExternalLoginADFS(string provider, string returnUrl)
{
return new ChallengeResult(provider, "ExternalLoginCallback.aspx");
}
internal class ChallengeResult : HttpUnauthorizedResult
{
public ChallengeResult(string provider, string redirectUri)
: this(provider, redirectUri, null)
{
}
public ChallengeResult(string provider, string redirectUri, string userId)
{
LoginProvider = provider;
RedirectUri = redirectUri;
UserId = userId;
}
public string LoginProvider { get; set; }
public string RedirectUri { get; set; }
public string UserId { get; set; }
public Task<ActionResult> Task { get; }
public class ActionResultTranslator
{
HttpContextBase _context;
public ActionResultTranslator(HttpContextBase context)
{
_context = context;
}
[HttpGet]
public void Execute(ActionResult actionResult)
{
ControllerContext fakeContext = new ControllerContext();
fakeContext.HttpContext = _context;
actionResult.ExecuteResult(fakeContext);
}
}
[HttpGet]
public override void ExecuteResult(ControllerContext context)
{
var properties = new AuthenticationProperties { RedirectUri = RedirectUri };
if (UserId != null)
{
properties.Dictionary[XsrfKey] = UserId;
}
context.HttpContext.GetOwinContext().Authentication.Challenge(properties, LoginProvider);
}
}
}
我找到了解决方案。
解决方案:
运行 启用它的 PowerShell 脚本