gpt4 book ai didi

c# - 将主体/用户上下文设置为用户对象

转载 作者:太空狗 更新时间:2023-10-29 17:36:48 27 4
gpt4 key购买 nike

我的 WebAPI 2 应用程序有一个自定义授权过滤器,用于检查访问 token 。如果 token 存在,并且 API 具有属性,那么我会检查是否存在映射到该 token 的用户。

由于 API 的性质,大多数方法都在特定用户的上下文中运行(即“POST api/profile”以更新用户的配置文件)。为此,我需要从访问 token 中获得的有关目标用户的信息。

[当前实现,发生在 AuthorizeAttribute 类型的属性内]

if( myDBContext.MyUsers.Count( x => x.TheAccessToken == clientProvidedToken ) ){
IPrincipal principal = new GenericPrincipal( new GenericIdentity( myAccessToken ), new string[] { "myRole" } );
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
return true;
}

这工作正常,然后我可以使用访问 token 在方法中进行第二次查找。 但由于我已经在授权时进行了查找,所以我不想浪费另一个数据库调用

[我想做什么(但显然行不通)]

MyUser user = myDBContext.MyUsers.FirstOrDefault( x => x.TheAccessToken == clientProvidedToken );
if( user != null ){
// Set *SOME* property to the User object, such that it can be
// access in the body of my controller method
// (e.g. /api/profile uses this object to load data)
HttpContext.Current.User = user;
return true;
}

最佳答案

您可以使用自己的主类。也许是这样的:

public class MyPrincipal : GenericPrincipal
{
public MyPrincipal(IIdentity identity, string[] roles)
: base(identity, roles)
{
}
public MyUser UserDetails {get; set;}
}

然后你的 Action 过滤器可以做:

MyUser user = myDBContext.MyUsers.FirstOrDefault( x => x.TheAccessToken == clientProvidedToken );
if(user != null)
{
MyPrincipal principal = new MyPrincipal( new GenericIdentity( myAccessToken ), new string[] { "myRole" } );
principal.UserDetails = user;
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
return true;
}
return false;

随后在您的实际方法中,您可以获取当前用户,检查它是否属于 MyPrincipal 类型,如果是,则转换它然后访问 UserDetails:

...
MyUser currentUser = null;
MyPrincipal curPrincipal = HttpContext.Current.User as MyPrincipal;
if (curPrincipal != null)
{
currentUser = curPrincipal.UserDetails;
}
...

我还没有真正尝试过这段代码,所以可能会有拼写错误......

关于c# - 将主体/用户上下文设置为用户对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19643754/

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