gpt4 book ai didi

session - 我在哪里可以使用 Windows 身份验证将用户信息加载到 ASP.NET MVC 5 中的 session ?

转载 作者:行者123 更新时间:2023-12-04 19:37:24 25 4
gpt4 key购买 nike

我想将 ASP.NET MVC 5 用于我的 Web 应用程序。我需要使用 windows authentication .

如果我使用 windows authentication哪里是读取用户信息(用户名和角色)并将其存储到Session的最佳位置?

我有通过用户名从数据库中获取用户信息的方法,如下所示:

public class CurrentUser
{
public int UserId { get; set; }

public string UserName { get; set; }

public Roles Roles { get; set; }
}

public enum Roles
{
Administrator,
Editor,
Reader
}

public class AuthService
{
public CurrentUser GetUserInfo(string userName)
{
var currentUser = new CurrentUser();

//load from DB

return currentUser;
}
}

最佳答案

您已经问了两个问题(1)获取用户信息的最佳位置和(2)如何将其存储在 Session 中。我将回答 (1),这样做可能表明您不需要在 session 中添加任何其他信息。

您已经声明您的应用程序正在使用 Windows 身份验证,这意味着在您的应用程序收到请求之前,IIS/HttpListener 已经完成了对用户进行身份验证的繁重工作。当您收到请求时,会有一个 WindowsPrincipalHttpContext.User .这将已经建立 Windows 用户名和 AD 角色,但您希望使用存储在数据库中的其他角色...

您可以访问您的 AuthService从应用程序的任何位置,但最好的方法可能是注册 IAuthorizationFilter并在那里工作。通过遵循这种方法,您从数据库中获取的其他角色和其他信息将在您的 Controller 方法中可用,并且可能更重要的是,从需要检查用户凭据的任何其他库代码中可用。

在 .Net 4.5 之前,如果您想向 WindowsPrincipal 添加其他信息我认为您唯一的选择是将系统提供的 User 替换为另一个实现了 IPrincipal 的对象。界面。这种方法仍然可用(以及我推荐的方法),但自从在 .Net 4.5 中引入 Windows Identity Foundation (WIF) 后,WindowsPrincipal源自  System.Security.Claims.ClaimsIdentityClaimsIdentity ,它支持向系统提供的主体添加额外的角色(和其他有用的信息)。但是,正如一些人发现的那样,Windows 中存在一个错误/功能会导致异常 The trust relationship between the primary domain and the trusted domain failed在检查以编程方式添加的角色时抛出。我们发现避免这种情况的一种简单而可靠的方法是将 User 替换为 GenericPrincipal .

所需步骤:

(1) 创建IAuthorizationFilter .

class MyAuthorizationFilter : IAuthorizationFilter
{
AuthService _authService;

public MyAuthorizationFilter(AuthService authService)
{
_authService = authService;
}

public void OnAuthorization(AuthorizationContext filterContext)
{
var principal = filterContext.HttpContext.User;

if (principal.Identity != null && principal.Identity.IsAuthenticated)
{
// Add username (and other details) to session if you have a need
filterContext.HttpContext.Session["User"] = principal.Identity.Name;

// get user info from DB and embue the identity with additional attributes
var user = _authService.GetUserInfo(principal.Identity.Name);

// Create a new Principal and add the roles belonging to the user
GenericPrincipal gp = new GenericPrincipal(principal.Identity, user.RoleNames.ToArray());
filterContext.HttpContext.User = gp;
}
}
}

(2) 注册您的过滤器。这可以在 Controller 级别或全局注册。通常,您将在 App_Start\FilterConfig.cs 中执行此操作:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyAuthorizationFilter(new AuthService()));
}
}

(3) 使用提供的 GenericPrincipal在您的应用程序代码中回答有关用户身份和其他凭据的问题。例如在您的 Controller 方法中,您可以访问存储在 GenericPrincipal 中的用户名或任何其他“声明”(例如电子邮件地址)。通过你的过滤器。
        public ActionResult Index()
{
ViewBag.Name = HttpContext.User.Identity.Name;
if(HttpContext.User.IsInRole("Administrator"))
{
// some role-specific action
}
return View();
}

因为您已经使用内置机制来记录主体角色,所以您可以从任何地方使用 HttpContext.User 访问用户详细信息。或 System.Threading.Thread.CurrentPrincipal .您也可以使用 AuthorizeAttribute在您的 Controller 方法中声明某些角色或用户可以使用哪些操作。例如
   public class HomeController : Controller
{
[Authorize(Roles = "Administrator")]
public ActionResult Admin()
{
return View();
}

MSDN有关 ClaimsIdentity 的更多详细信息

我希望这有帮助

-抢

关于session - 我在哪里可以使用 Windows 身份验证将用户信息加载到 ASP.NET MVC 5 中的 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39448925/

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