![]() |
奔放的楼房 · 使用Google Chrome ...· 2 天前 · |
![]() |
近视的机器猫 · UnionAll如何提高效率? - ...· 1 月前 · |
![]() |
安静的麻辣香锅 · 女装山脉冷狐安卓汉化版-女装山脉冷狐安卓汉化 ...· 4 月前 · |
![]() |
微醺的墨镜 · 12个直接影响消费者决策的社会心理学理论(上 ...· 5 月前 · |
![]() |
飞奔的绿茶 · PHP怎么写结算上个月业绩 • ...· 7 月前 · |
我正在创建一个Asp.NET MVC5应用程序。对于这个项目,我尝试实现一个自定义的身份验证机制(我不想使用Forms authentication / OWIN等外部提供程序)
我创建了一个自定义authorize属性,如下所示:
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class myAuthorize : AuthorizeAttribute
protected override bool AuthorizeCore(HttpContextBase httpContext)
if (!HttpContext.Current.Request.IsAuthenticated)
httpContext.Response.Redirect("~/Account/Login");
return base.AuthorizeCore(httpContext);
}
在我的登录操作中,我尝试更改
HttpContext.User.Identity.IsAuthenticated
但它是只读的,我无法更改该值。我可以手动更改它的值吗?还是我犯了一个逻辑错误。
发布于 2020-03-21 06:41:55
您可以通过手动设置HttpContext.User来实现此目的:
var identity = new ClaimsIdentity("Custom");
HttpContext.User = new ClaimsPrincipal(identity);
设置自定义
authenticationType
非常重要。在上面的例子中,我只使用了字符串"Custom",但是它可以是你想要的任何东西。
这样,
HttpContext.User.Identity.IsAuthenticated
就是
true
了。
对于更复杂的东西,您可以添加如下声明:
var identity = new ClaimsIdentity(new List<Claim>
new Claim("UserId", "123", ClaimValueTypes.Integer32)
}, "Custom");
HttpContext.User = new ClaimsPrincipal(identity);
这将导致:
HttpContext.User.Identity.IsAuthenticated == true;
int.Parse(((ClaimsIdentity)HttpContext.User.Identity).ValueFromType("UserId")) == 123;
发布于 2019-03-14 16:53:45
我的答案可能不会完全适合你,但它可能会有所帮助。在我的ASP.NET Core MVC应用程序中,管理员需要模拟其他用户。它是一个intranet应用程序,显然用户是通过Windows身份验证进行身份验证的。这要归功于对此控制器操作的ajax请求:
public async Task<JsonResult> UserImpersonation(IdentityExtension userIdentity)
IdentityExtension是一个自定义类,您可以在下面观察到它的签名:
public class IdentityExtension : IIdentity
public IdentityExtension()
public IdentityExtension(string name)
this.Name = name;
public string AuthenticationType => "Kerberos";
public bool IsAuthenticated => true;
public string Name { get; set; }
}
UserImpersonation方法返回ReplaceUser方法的成功状态,通过这种方式更新HttpContext.User:
this.HttpContext.User = identity as ClaimsPrincipal;
return true;
标识是IdentityExtension的实例。
我希望我的解决方案能够适应您的用例!
发布于 2021-10-21 10:40:03
我们可以从源代码中看到:
/// <summary>
![]() |
飞奔的绿茶 · PHP怎么写结算上个月业绩 • Worktile社区 7 月前 |