创建我自己的IPrincipal,并IIdentity实现如下图所示:
[ComVisible(true)]
[Serializable]
public sealed class CustomIdentity : IIdentity {
private readonly string _name;
private readonly string _email;
// and other stuffs
public CustomIdentity(string name) {
_name = name.Trim();
if(string.IsNullOrWhiteSpace(name))
return;
_email = (connect to database and read email and other stuffs);
}
public string Name {
get { return _name; }
}
public string Email {
get { return _email; }
}
public string AuthenticationType {
get { return "CustomIdentity"; }
}
public bool IsAuthenticated …Run Code Online (Sandbox Code Playgroud) forms-authentication iprincipal iidentity custom-authentication asp.net-mvc-3
以下是上下文:
问题:
{
"message": "User is not authorized to access this resource"
}Run Code Online (Sandbox Code Playgroud)
另外,我已经为授权者禁用了缓存.
可能是什么导致了这个问题?
我使用ASP.NET MVC 4 Web应用程序作为一些WCF服务的前端.所有用户登录/注销和会话控制都在后端完成.MVC应用程序应该只存储具有会话ID的单个cookie.我的客户端不允许使用表单身份验证,所有内容都必须自定义.
我在web.config中设置了以下内容:
<system.web>
...
<authentication mode="None" />
</system.web>
<system.webServer>
<modules>
...
<remove name="FormsAuthentication" />
...
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
我还有一个全局过滤器:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// Force all actions to request auth. Only actions marked with [AllowAnonymous] will be allowed.
filters.Add(new MyAuthorizeAttribute());
}
}
Run Code Online (Sandbox Code Playgroud)
在Global.asax中调用
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
Run Code Online (Sandbox Code Playgroud)
我用[AllowAnonymous]标记了每个不需要授权的控制器和操作.
现在我必须实现MyAuthorizeAttribute.我尝试了一些教程,但没有一个完全符合我的场景.
基本上,我必须为每个操作处理以下方案:
据我所知,我需要覆盖AuthorizeCore(检查我的cookie以查看会话是否存在且仍然有效)和HandleUnauthorizedRequest(将用户重定向到Home/Index而不是默认的Login页面).
对于重定向,我试过:
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
filterContext.Result = new RedirectResult("/Home/Index/NeedsLogin");
}
Run Code Online (Sandbox Code Playgroud)
这似乎处理第二个罚款的情况(我不确定那个基本呼叫,但它是否需要?).
对于第一种情况,我需要实现AuthorizeCore.我不确定,如何正确地做到这一点.我已经看到AuthorizeAttribute有一些代码用于处理缓存情况,也许还有更多隐藏的功能,我不想打破它.
对于第三种情况,我不确定MyAuthorizeAttribute是否能够处理它.AuthorizeAttribute可以捕获Action内部发生的异常,或者我必须在我的全局错误处理程序中处理SecurityFault.SessionExpired情况吗?
对于Kinesis流,我使用AWS API Gateway创建了代理API.我使用python Lambda为代理添加了一个自定义授权程序.在发布lambda函数和部署API之后,我能够使用Gateway Test功能成功测试API.我可以看到cloudwatch中的日志,其中包含来自自定义auth lambda函数的详细打印.成功验证后,API Gateway将记录推送到我的Kinesis流
但是当我从Chrome Postman客户端调用相同的API时,我得到500内部服务器错误,响应头包括X-Cache→来自cloudfront的错误,x-amzn-ErrorType→AuthorizerConfigurationException
Lambda auth函数返回允许对我的API执行请求的策略.返回的政策文件是:
{
"policyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "execute-api:Invoke",
"Resource": [
"arn:aws:execute-api:us-east-1:1234567:myapiId/staging/POST/*"
],
"Effect": "Allow"
}
]
},
"principalId": "Foo"
}
为什么请求会因Chrome或curl而失败,但API网关的相同API测试工作正常?
amazon-web-services custom-authentication aws-lambda aws-api-gateway
我打算使用下面的代码来实现我的web api安全性,但我不确定这是否足够安全和合理.我不想使用OWIN和AspNet.Identity,因为它对我来说非常复杂,我不完全理解,我不知道我如何定制数据库表,用户角色等.但我的方式很简单,非常可定制我.
这是CustomAuthorizeAttribute;
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if ((actionContext.Request.Headers.GetValues("Host").FirstOrDefault().Contains("localhost:15742")))
{
IEnumerable<string> access_token;
if (actionContext.Request.Headers.TryGetValues("Authorization", out access_token))
{
var user = GetUserByToken(access_token);
if (user!=null && !user.TokenIsExpired)
{
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom " + access_token.FirstOrDefault());
return;
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
HttpContext.Current.Response.AddHeader("WWW-Authenticate", "Custom");
return;
}
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized);
}
}
else
{
actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Forbidden);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是前端使用
<script type="text/javascript">
$(function () {
var access_token = $.cookie('access_token');
if (access_token == undefined) …Run Code Online (Sandbox Code Playgroud) asp.net restful-authentication authorize-attribute custom-authentication asp.net-web-api
我已经实现了自己的自定义身份验证中间件和处理程序,并在应用启动时配置了它们.这一切都很好.
在我的自定义auth处理程序中,我已经覆盖了HandleAuthenticateAsync()以执行我自己的自定义身份验证,我还重写了HandleUnauthorizedAsync()以便将用户重定向到登录页面,但是这不会被调用.
浏览器在响应中收到401(未授权).我期待调用我的HandleUnauthorizedAsync().
我在这里没有正确理解管道吗?
谢谢
我在ASP.NET MVC中实现了自定义身份验证.如果有效用户尝试登录,我HttpContext.User = user在AccountController的Logon方法中设置.但它仍然存在于那个请求.如何为会话设置它?
我用了另一种方法HttpContext.Session["CurrentUser"] = user.如果我想看看会话是否被授权,我必须检查一下HttpContext.User != null.但是,我不想在应用程序的任何地方公开身份验证逻辑.如果我需要改变它,那就太乱了.
请帮我解决这个问题.一个解决方案可能是使用开头HttpContext.User的值填充每个请求的属性HttpContext.Session["CurrentUser"],但我不知道如何做到这一点.
我目前有一个 API 通过我们的 API 网关,该网关附加了多个自定义授权者 -LiveAuthorizer和TestAuthorizer.
我想根据正在访问的阶段更改我的自定义授权者,就像阶段变量一样。如果我们处于阶段测试,请使用TestAuthorizer,如果处于现场使用LiveAuthorizer。
从我的研究和本页来看,这似乎不可能,有什么想法吗?
PS - 我知道这可以在执行身份验证的 Lambda 函数内处理,我只是好奇是否有另一种方法(类似于阶段变量)。
amazon-web-services custom-authentication aws-lambda aws-api-gateway
我想使用一个秘密密钥(api密钥)授权asp.net核心web api.密钥将在Authorization标头中传递,如下所示,
ex. Authorization keytype;h43484344343bbhfdjfdfhj34343
Run Code Online (Sandbox Code Playgroud)
我想编写一个中间件来从请求头读取此密钥,并调用内部api来验证密钥.
在web api中,我们可以编写一个消息处理程序来执行此操作,但我是asp.net核心的新手.我看到了很多样本,但他们正在使用内置的JWT令牌认证.但是我想使用自己的密钥并解密此密钥并对数据库条目进行验证.
任何人都可以建议一些代码示例如何做到这一点?
如何在API网关中从自定义授权器lambda函数获取日志记录?我不想为API启用日志记录.我需要从授权者lambda函数中记录.我使用python lambda函数并在代码中打印.我想在Cloud Watch日志中查看打印件.但是在云计算中看不到日志.我也没有得到错误.我错过了什么?
Lambda具有执行角色角色/ service-role/MyLambdaRole.此角色具有写入云监视的策略.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "logs:CreateLogGroup",
"Resource": "arn:aws:logs:us-east-1:123456:*"
},
{
"Effect": "Allow",
"Action": [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:us-east-1:123456:log-group:MyCustomAuthorizer:*"
]
}
]
}
我还通过将CloudWatchLogsFullAccess策略添加到role/service-role/MyLambdaRole角色来测试.
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"logs:*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
amazon-web-services custom-authentication aws-lambda aws-api-gateway
aws-lambda ×3
asp.net-mvc ×2
.net ×1
asp.net ×1
asp.net-core ×1
iidentity ×1
iprincipal ×1
unauthorized ×1