看到这个类似的问题:Need access more user properties in User.Identity
我想创建自定义身份验证方法以与我的 Razor 视图一起使用,该方法允许轻松访问IdentityUser
与 User.Identity 对象相关的属性,但我不知道如何去做。我想创建几个类似于 , 等的自定义扩展User.Identity.GetUserName()
,User.Identity.GetUserById()
而不是使用这个ViewContextExtension方法。我的身份验证类型目前是DefaultAuthenticationTypes.ApplicationCookie
VS2013 MVC5 模板中的默认类型。正如 Shoe 所说,我需要在用户登录后插入此声明。
我的问题是:
您如何以及在何处创建具有this IIdentity
IPrincipal 下的 out 参数的自定义声明?
这将允许我通过视图中的 CookieAuthentication 访问用户属性,以访问 DDD 设置中的实体,其中我在使用 Identity 2.0 的单个应用程序中有多个 DbContext。我最终将使用 WebAPI,但现在我希望它尽可能简单。我找到了这个 SO Q&A,但它适用于使用门票的 Web 表单。也不确定门票和代币之间的区别?
这是ViewContext
从基本控制器使用的当前方法:
看法:
@using Microsoft.AspNet.Identity
@using Globals.Helpers
@using Identity //custom Identity for Domain
@using Microsoft.AspNet.Identity.Owin
@if (Request.IsAuthenticated)
{
var url = @ViewContext.BaseController().GetAvatarUrlById(User.Identity.GetUserId<int>());
//...
}
基本控制器.cs
public string GetAvatarUrlById(int id)
{
var user = UserManager.FindById(id);
return "../../" + user.ImageUrl;
}
扩展.cs
public static class ViewContextExtension
{
public static BaseController BaseController(this ViewContext view)
{
var baseController = (BaseController)view.Controller;
return baseController;
}
}
我正在寻找的是,但在哪里以及如何?
看法:
<img src="@User.Identity.GetAvatarUrl()" alt="User.Identity.GetAvatarUrl()" />
解决方案
我只是编辑了Extension.cs文件并使用了用于 _LoginPartial.cshtml 的 Base 控制器的继承并编辑了ViewContextExtension
该类:
#region ViewContextExt
public static class ViewContextExtension
{
public static BaseController BaseController(this ViewContext view)
{
var baseController = (BaseController)view.Controller;
return baseController;
}
public static string GetAvatarUrl(this IIdentity identity)
{
return ((ClaimsIdentity)identity).Claims.First(c => c.Type == "AvatarUrl").Value;
}
}
}
# endregion