我看过以下两个可访问的布尔值:
System.Web.Mvc.Controller.User.Identity.IsAuthenticatedSystem.Web.Mvc.Controller.Request.IsAuthenticated这些之间有区别吗?他们似乎都做同样的事情所以我不确定使用哪个.
我想做的是:
@if (User.Identity.IsAuthenticated) {
if (User.IsInRole("Admin")) {
@Html.ActionLink("Admin", "AdminController")
}
}
Run Code Online (Sandbox Code Playgroud)
要么
@if (Request.IsAuthenticated) {
if (User.IsInRole("Admin")) {
@Html.ActionLink("Admin", "AdminController")
}
}
Run Code Online (Sandbox Code Playgroud)
上述任何一种都可以同样好用吗?
在我的休息服务中,我可以在认证后使用获取主要信息
KeycloakPrincipal kcPrincipal = (KeycloakPrincipal) servletRequest.getUserPrincipal();
Run Code Online (Sandbox Code Playgroud)
声明.
Keycloak校长并不知道我需要有关经过身份验证的用户的所有信息.是否可以自定义我自己的主体类型?在keycloak-server-end上我开发了一个用户联合提供程序.我看到UserModel可以为我的用户添加一组自定义属性.
是否可以在该代码中插入我的自定义主体?
是否可以从keycloak principal检索此属性?
这是什么方式?
我想在经过身份验证的用户中存储额外的信息,以便我可以轻松访问它(例如User.Identity.Id),而不仅仅是名称,因为我计划让它具有非唯一性.
到目前为止,我已经收集到了我应该寻求实现自定义Principal和/或Identity,但我不确定如何去实现它.我一直在寻找有关此事的文档和教程,但我在不同的地方找到了相关的东西,我发现它有点令人困惑.
我已经看到了如何将自定义信息添加到用户数据属性中的身份验证cookie,但我希望获得单元测试的依赖注入的好处,我可以使用主体和身份.
如果我想实现自己的Principal或Identity,我需要考虑哪些确切的步骤?
在这种情况下我能做的最简单的事情是什么(只需添加ID并保留所有默认值)?"默认值"将包括默认提供者(成员资格,角色等).
我已经看到了另一个问题,但我很欣赏不会在两者之间留下任何漏洞的答案,例如示例中AuthenticateRequest事件中的角色魔术字符串.相反,我需要知道如何将默认SqlRoleProvider中的角色添加到当前用户:何时何地执行此操作,以及是否需要执行任何其他操作以将新类与其他默认提供程序连接.
能够转到示例ASP.NET MVC 2应用程序(例如,来自visual studio 2010模板),进行编辑并使其工作是非常棒的.
编辑:我已经编辑了这个问题,以便更好地表明我在这里已经失去了很多,所以我无法用太高的答案来做.
PS:在我看来,在身份而不是校长中使用ID会更有意义,尽管我在某种程度上已经说过这个.
如何在不同用户的安全上下文中启动线程?当进程正常启动一个线程时,安全上下文也会被传递但是如何在不同安全上下文中使用不同用户的主体启动一个线程?
这是一个简单的控制台应用程序,我在命令提示符下运行:
using System;
using System.Threading;
namespace Test
{
internal class Runner
{
[STAThread]
static void Main(string[] args)
{
Console.WriteLine(Thread.CurrentPrincipal.GetType().Name);
Console.WriteLine(Thread.CurrentPrincipal.Identity.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出为"GenericPrincipal",空字符串为身份名称.为什么运行时构造GenericPrincipal而不是WindowsPrincipal?我如何强制它WindowsPrincipal从启动过程的安全令牌构建(在我的情况下为cmd.exe)?
使用spring security时,特别是@notation; 在Controller中访问主体的正确方法是什么?让我们说以下是我的控制器,但我想在某个地方访问secure()方法中的主体...
@Controller
public class LoginController {
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(ModelMap map, @RequestParam(value="fail" , required=false) String fail){
map.addAttribute("title", "Login: AD Credentials");
if(fail != null){
map.addAttribute("error", "Invalid credentials");
}
return("login");
}
@RequestMapping("/secure")
@PreAuthorize("isAuthenticated()")
public String secure(ModelMap map, String principal){
System.out.println(principal);
return("secure");
}
}
Run Code Online (Sandbox Code Playgroud) 我有Spring MVC REST频道:
@Controller
@RequestMapping("/rest")
public class REST {
Run Code Online (Sandbox Code Playgroud)
我有我的方法:
@RequestMapping(value = "/doSomething")
public @ResponseBody DoSomethingResultDTO doSomething(
@RequestBody DoSomethingRequestDTO)
Run Code Online (Sandbox Code Playgroud)
现在我需要登录用户的名称.通常我可以通过该方法来完成
HttpServletRequest.getUserPrincipal()
Run Code Online (Sandbox Code Playgroud)
但如何在这里得到它?我有header(@RequestHeader),甚至cookies(@CookieValue)的注释.但是我怎样才能获得Principal我的方法呢?
我正在使用ASP.Net Web API 2/.Net 4.5.2.
我在排队后台工作项时试图保留调用主体.为此,我试图:
Thread.CurrentPrincipal = callingPrincipal;
Run Code Online (Sandbox Code Playgroud)
但是当我这样做时,我得到一个ObjectDisposedException:
System.ObjectDisposedException:已关闭安全句柄
如何将当前主体保留在后台工作项中?
我可以以某种方式复制校长吗?
public void Run<T>(Action<T> action)
{
_logger.Debug("Queueing background work item");
var callingPrincipal = Thread.CurrentPrincipal;
HostingEnvironment.QueueBackgroundWorkItem(token =>
{
try
{
// UNCOMMENT - THROWS EXCEPTION
// Thread.CurrentPrincipal = callingPrincipal;
_logger.Debug("Executing queued background work item");
using (var scope = DependencyResolver.BeginLifetimeScope())
{
var service = scope.Resolve<T>();
action(service);
}
}
catch (Exception ex)
{
_logger.Fatal(ex);
}
finally
{
_logger.Debug("Completed queued background work item");
}
});
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个需要将插件加载到单独的子应用程序域中的应用程序.只有一个插件加载到一个子应用程序域中.每个插件都需要不同的Windows标识,并且这些标识与默认(父)应用程序域中使用的Windows标识不同.每个插件都加载一个或多个子插件.
例如,默认应用程序域的身份是Authority\Limited(权限是域名或计算机名称).两个插件加载到两个子应用程序域中.加载的插件的标识是Authority\Privileged1和Authority\Privileged2.Authority\Privileged1和Authority\Privileged2分别具有对数据库Database1和Database2的所有必要访问权限,而Authority\Limited无权访问任何上述数据库.
在创建子应用程序域时,我调用System.AppDomain.SetThreadPrincipal方法传递System.Security.Principal.WindowsPrincipal实例.该实例是从从重复的用户令牌创建的System.Security.Principal.WindowsIdentity实例创建的(请参阅http://support.microsoft.com/kb/306158).我已经省略了对WindowsIdentity.Impersonate方法的调用,因为我在创建WIndowsPrincipal实例时处于默认应用程序域中.
我希望设置app域线程主体足以使加载的插件成功登录到各自的数据库并执行一些T-SQL语句.令我惊讶的是,打开与数据库的连接时使用WindowsIdentity.GetCurrent()方法返回的值.方法返回的值是进程标识或模拟标识.
由于进程标识没有使用数据库所必需的权限,因此不可接受.因此,冒充必须发挥作用.但是,模拟必须仅在子应用程序域中进行.每个插件都公开了用于执行插件加载和卸载的方法.我知道我必须在开始时进行模拟并撤消这些方法结束时的模拟.但是,必须对子应用程序域中生成的所有线程进行模拟.由于每个插件都加载了一个或多个子插件,并且每个插件可能会产生一个或多个线程,因此必须在许多地方执行模拟,这看起来非常混乱.
是否可以仅执行一次模拟,以便影响在子应用程序域中生成的所有线程?
我正在尝试获取与当前用户关联的电子邮件。下面显示了我在身份验证中添加 Claims 的几行。
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var identity = new ClaimsIdentity(context.Options.AuthenticationType);
try
{
CreateDataConnection();
R_AuthenticateUser oAuthUser = oDataConnection.Authenticate(context.UserName,context.Password);
string DB_User_roles = oAuthUser.UserLoginRoles;
if (oAuthUser.Authenticated)
{
string[] aray = DB_User_roles.Split(',');
identity.AddClaim(new Claim(ClaimTypes.Name, oAuthUser.UserID.ToString())); // keeps the login_ID
identity.AddClaim(new Claim(ClaimTypes.Email, context.UserName));
foreach (var item in aray)
{
// identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, item));
identity.AddClaim(new Claim(ClaimTypes.Role, item));
}
context.Validated(identity);
}
else //if (context.UserName == "user" && context.Password == "user")
{
context.SetError("Incorrect credntials", "Provided Username and Password is incorrect");
return;
}
} …Run Code Online (Sandbox Code Playgroud)