gpt4 book ai didi

asp.net-mvc - 表单例份验证 + ASP.NET MVC 绝对 ReturnURL

转载 作者:行者123 更新时间:2023-12-04 01:43:40 24 4
gpt4 key购买 nike

我在服务器 a 上有一个中央身份验证应用程序。服务器 b 在同一个域中有一个或多个应用程序需要从服务器 a 进行身份验证。设置它很容易,以便服务器 b 应用程序重定向到服务器 a。让 ReturnURL 成为绝对值并不容易。

这是皱纹。服务器 b 上的消费应用程序有两个 Controller ,一个是公共(public)的,一个是安全的。如果将 [authorize] 装饰放在公共(public)的操作(这是默认 Controller )上,我会得到正确的绝对 URL。但是,如果它在它自己的 Controller 中,我会得到一个相对 URL。

我可以拦截消费应用程序中的预请求事件,但我需要网站的某些部分是公开的,而不是整个粉碎。

想法?

最佳答案

如果请求未通过身份验证,标准 AuthorizeAttribute 的工作方式是将响应状态代码设置为 401。这会启动默认身份验证模块对未经授权的请求的标准响应。我假设您正在使用基于表单的身份验证,它将根据请求中的 url 构建返回 url。在这种情况下,可能是一个相对 URL。

您可以做的一件事是,您可以实现一个扩展 AuthorizeAttribute 类并覆盖 OnAuthorization 的 SSOAuthorizeAttribute,而不是依赖内置行为。然后,您可以从 Web 配置中的表单元素中提取 loginUrl 并构建您自己的 RedirectResult 并从 AuthorizationContext 参数中的 HttpContext.Request.Url.AbsoluteUri 属性中提取 returnUrl。

 public class SSOAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(
AuthorizationContext filterContext )
{
if (filterContext == null)
{
throw new ArgumentNullException( "filterContext" );
}

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// get from cached variable from web configuration
string loginUrl = ...
if (filterContext.HttpContext.Request != null)
{
loginUrl += "?ReturnUrl=" + filterContext.HttpContext
.Request
.Url
.AbsoluteUri;
}

filterContext.Result = new RedirectResult( loginUrl );
}
}
}

关于asp.net-mvc - 表单例份验证 + ASP.NET MVC 绝对 ReturnURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/379506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com