我正在创建一个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>
/// Gets a value that indicates if the user has been authenticated.
/// </summary>
public virtual bool IsAuthenticated
{
get { return !string.IsNullOrEmpty(_authenticationType); }
}
因此,这意味着当我们有一个空的_authenticationType时,IsAuthenticated将始终为false;否则,它将为true。
https://stackoverflow.com/questions/55121548
复制相似问题