首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何手动设置HttpContext.User.Identity.IsAuthenticated的值

如何手动设置HttpContext.User.Identity.IsAuthenticated的值
EN

Stack Overflow用户
提问于 2019-03-12 20:31:16
回答 4查看 4.6K关注 0票数 5

我正在创建一个Asp.NET MVC5应用程序。对于这个项目,我尝试实现一个自定义的身份验证机制(我不想使用Forms authentication / OWIN等外部提供程序)

我创建了一个自定义authorize属性,如下所示:

代码语言:javascript
复制
[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);
    }
}

在我的登录操作中,我尝试更改

代码语言:javascript
复制
HttpContext.User.Identity.IsAuthenticated

但它是只读的,我无法更改该值。我可以手动更改它的值吗?还是我犯了一个逻辑错误。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-03-21 06:41:55

您可以通过手动设置HttpContext.User来实现此目的:

代码语言:javascript
复制
var identity = new ClaimsIdentity("Custom");
HttpContext.User = new ClaimsPrincipal(identity);

设置自定义authenticationType非常重要。在上面的例子中,我只使用了字符串"Custom",但是它可以是你想要的任何东西。

这样,HttpContext.User.Identity.IsAuthenticated就是true了。

对于更复杂的东西,您可以添加如下声明:

代码语言:javascript
复制
var identity = new ClaimsIdentity(new List<Claim>
{
    new Claim("UserId", "123", ClaimValueTypes.Integer32)
}, "Custom");

HttpContext.User = new ClaimsPrincipal(identity);

这将导致:

代码语言:javascript
复制
HttpContext.User.Identity.IsAuthenticated == true;
int.Parse(((ClaimsIdentity)HttpContext.User.Identity).ValueFromType("UserId")) == 123;
票数 7
EN

Stack Overflow用户

发布于 2019-03-14 16:53:45

我的答案可能不会完全适合你,但它可能会有所帮助。在我的ASP.NET Core MVC应用程序中,管理员需要模拟其他用户。它是一个intranet应用程序,显然用户是通过Windows身份验证进行身份验证的。这要归功于对此控制器操作的ajax请求:

代码语言:javascript
复制
public async Task<JsonResult> UserImpersonation(IdentityExtension userIdentity)

IdentityExtension是一个自定义类,您可以在下面观察到它的签名:

代码语言:javascript
复制
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:

代码语言:javascript
复制
this.HttpContext.User = identity as ClaimsPrincipal;
return true;

标识是IdentityExtension的实例。

我希望我的解决方案能够适应您的用例!

票数 0
EN

Stack Overflow用户

发布于 2021-10-21 10:40:03

我们可以从源代码中看到:

代码语言:javascript
复制
 /// <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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55121548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档