如果我想保护我的MVC应用程序中的特定部分,我将使用[Authorize]ActionMethod.我也知道我可以将它用于整个控制器,这样我就不必为其中的每个ActionMethod指定它.
我想在全球范围内要求授权,并且希望能够仅在少数几个地方允许匿名用户.如何要求用户在全球范围内获得授权,并允许匿名用户使用一些ActionMethods?
asp.net-authorization asp.net-identity asp.net-core-mvc asp.net-core
我花了最后一周为现有的MVC应用程序创建API,现在我正在尝试保护API以及根据需要重新修改MVC端安全性.
目前,MVC应用程序设置为通过OWIN/OAuth/Identity使用应用程序cookie.我试图合并设置Web API的Bearer令牌,以便在调用受限API方法时生成,但到目前为止收效甚微 - GET请求工作正常,但POST请求在收到时失去了Authorization标头. API.
我已经创建了一个SDK客户端,MVC应用程序正在使用它来调用API,并尝试了三种为API的任何给定调用设置Authorization标头的方法,所有这些方法似乎都能正常工作对于GET请求很好,但是对于我需要做的任何POST请求完全失败...
我可以在MVC控制器中设置Request标头:
HttpContext.Request.Headers.Add("授权","承载"+ response.AccessToken);
(其中response.AccessToken是先前从API检索的令牌)
我可以通过SDK客户端上的扩展方法设置Request头:
_apiclient.SetBearerAuthentication(token.AccessToken)
或者我可以在SDK客户端上手动设置Request标头:
_apiClient.Authentication = new AuthenticationHeaderValue("Bearer,accessToken);
(其中accessToken是先前检索的令牌,传递给被调用的Client方法).
从这一点来看,我几乎没有什么可以解决导致这个问题的原因.到目前为止,我唯一能够收集的是ASP.NET导致所有POST请求首先发送请求,并带有Expect标头,用于HTTP 100-Continue响应,之后它将完成实际的POST请求.但是,似乎当它执行第二次请求时,Authorization标头不再存在,因此API的Authorize属性将导致401-Unauthorized响应,而不是实际运行API方法.
那么,我如何获取能够从API检索的Bearer令牌,并在后续请求中使用它,包括我需要做的各种POST请求?
除此之外,将此令牌存储在MVC应用程序本身的最佳方法是什么?我宁愿避免将字符串传递给应用程序中可能需要它的每个方法,但我也一直在阅读,出于安全原因将其存储在cookie中是一个非常糟糕的主意.
在我通过这个问题后,我会立即感兴趣的几点:
使用OAuth Bearer Tokens是否意味着我不能再将ApplicationCookies用于MVC应用程序?和/或它会在整个应用程序中使以下代码无用吗?
User.Identity.GetUserId()
目前我被迫评论我的API [授权]属性以继续我的工作,这显然不是理想的但它确实允许我暂时继续处理.
启动文件:
MVC:
public class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
private void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ADUIdentityDbContext.Create);
app.CreatePerOwinContext<ADUUserManager>(ADUUserManager.Create);
app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
{
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
//This should be set to FALSE before we move to production.
AllowInsecureHttp = true,
ApplicationCanDisplayErrors = true,
TokenEndpointPath = new PathString("/api/token"),
}); …Run Code Online (Sandbox Code Playgroud) post asp.net-authorization oauth-2.0 asp.net-mvc-5 asp.net-web-api2
我有一个用于API的自定义授权过滤器,该过滤器会检查保存在数据库中的令牌。
像这样
override public void OnAuthorization(AuthorizationContext context)
{
if (!context.HttpContext.Request.Headers.Keys.Contains("X-CustomToken"))
{
context.HttpContext.Response.StatusCode = 401; //Unauthorized
return;
}
var headerToken = context.HttpContext.Request.Headers
.Where(a => a.Key.ToLower() == "x-customtoken").FirstOrDefault();
var company= _repository.GetCompanyByToken(headerToken.Value);
if (company == null)
{
context.Result = new HttpStatusCodeResult(401);
return;
}
_myFactory.SetCurrentCompany(company);
}
Run Code Online (Sandbox Code Playgroud)
问题是,正如我在此处询问的其他问题中所读到的一样,它被重定向到登录页面,就像对前端控制器一样。我通常阅读的解决方案是完全覆盖此行为。但是,我的项目在同一解决方案中有一个前端和一个API,因此仅在使用我的自定义属性时才需要覆盖它。
谢谢
我们很少有 ASP.NET 4.5 应用程序共享由 Web 配置机器密钥保护的身份验证 cookie (SSO) ,我不会更改它们。
ASP.NET 4.5 登录:
var auth = FederatedAuthentication.SessionAuthenticationModule;
auth.WriteSessionTokenToCookie(new System.IdentityModel.Tokens.SessionSecurityToken(cp));
Run Code Online (Sandbox Code Playgroud)
现在我们即将在同一个域中实现新的 ASP.NET 核心应用程序,我们希望保留旧的 cookie 授权机制。联合身份验证在 CORE 的运行时失败,是否有任何线索可以解密来自同一域的旧 cookie 并与 asp.net 和 asp.net core 共享新的 cookie?
ASP.NET 核心设置:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AuthorizePage("/Contact");
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
#region snippet1
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
#endregion
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{ …Run Code Online (Sandbox Code Playgroud) 我们有一个面向内部的(C#/MVC/IIS7)应用程序,其要求用户不必输入凭据,但我们需要网络/Windows 用户名来识别当前用户是谁。
有什么办法可以做到这一点吗?谢谢!
c# asp.net-mvc iis-7 windows-authentication asp.net-authorization
也许我错过了一些东西,但是,我阅读了大量关于使用 .NET Core 2.0 进行身份验证和授权的文档和文章,但我没有找到任何关于用户管理的内容。
我想要实现的是拥有一个管理员用户界面,可以创建用户、列出所有现有用户并将他们分配给预定义的角色和/或预定义的策略。
我尝试这样做但没有成功(我在尝试使用模型时遇到问题,例如IEnumerable<IdentityUser>关于无效构造函数:
InvalidOperationException:找不到适合类型“System.Collections.Generic.IEnumerable`1[Microsoft.AspNetCore.Identity.IdentityUser]”的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。
我无法RoleManager在任何控制器中获取。它适用于 UserManager,但不适用于 RoleManager。我加了
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)
到启动,所以我教它会自动注入 DI ......
ApplicationUser 定义如下:
namespace KaraokeServices.Data
{
public class ApplicationUser : IdentityUser
{
}
}
Run Code Online (Sandbox Code Playgroud)
我定义了一个 UserController 如:
namespace KaraokeServices.Controllers
{
[Route("[controller]/[action]")]
public class UserController : Controller
{
private readonly UserManager<ApplicationUser> userManager;
public UserController(ApplicationDbContext pContext, SignInManager<ApplicationUser> pSignInManager, ILogger<AccountController> logger)
{
userManager = pSignInManager.UserManager;
}
[HttpGet]
public IActionResult Index()
{
List<ApplicationUser> users = new List<ApplicationUser>();
users = userManager.Users.ToList();
return View(users);
} …Run Code Online (Sandbox Code Playgroud) 我有以下代码,我想了解这两种扩展方法之间有什么区别。每一个人都做什么?
services.AddAuthentication (JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer (options => options.TokenValidationParameters = new TokenValidationParameters {
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero,
ValidIssuer = Issuer,
ValidAudience = Audience,
IssuerSigningKey = new SymmetricSecurityKey(secret)
});
services.AddAuthorization();
Run Code Online (Sandbox Code Playgroud)
谢谢,
c# asp.net-authorization asp.net-authentication jwt asp.net-core
HubConnection我正在尝试通过C# .NET 客户端中的a 传递 access_token 。但是,结果与我通过 TypeScript 客户端看到的结果不一致。这种不一致会导致 C# .NET 客户端中的授权失败,但 TypeScript 客户端中的授权成功。
这是相关代码:
打字稿
var builder = new signalr.HubConnectionBuilder();
builder.withUrl(hubUrl, {accessTokenFactory: () => token});
Run Code Online (Sandbox Code Playgroud)
C#
var builder = new HubConnectionBuilder();
builder.WithUrl(url, o => {
o.AccessTokenProvider = () => Task.FromResult(_token);
//I've tried the following as well
//o.Headers.Add("Authorization", "Bearer " + _token);
});
Run Code Online (Sandbox Code Playgroud)
TypeScript 代码生成一个 HTTP 请求,如下所示:
POST http://localhost:5000/machine/negotiate?negotiateVersion=1 HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGVzdCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluaXN0cmF0b3IiLCJleHAiOjE1NzYxODYwMTYsImlzcyI6Im5TY3J5cHQsIEluYy4iLCJhdWQiOiJuU3R1ZGlvIFVzZXIifQ.qxAzu-NgzlnfCqyysiML4Z0_s6UBTeRb7wcuGno9rk4
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …Run Code Online (Sandbox Code Playgroud) 如何实现资源列表的授权?
我看到的所有文档都基于 IAuthorizationService 和 AuthorizeAsync 方法。但这仅适用于一种资源。
我是否应该检索所有资源,然后使用 IAuthorizationService 的 AuthorizeAsync 方法强制检查用户是否有权访问?这看起来非常笨拙、缓慢且低效。
你会怎么做?
asp.net-authorization .net-core asp.net-core asp.net-core-webapi
从 ASP.NET Core 3.1 升级到版本 5 后,context.User.Claims为空
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
Run Code Online (Sandbox Code Playgroud)
在
public class MyRequirementHandler : AuthorizationHandler<MyRequirement>
Run Code Online (Sandbox Code Playgroud)
我将Authorization标头与 JWT 的不记名令牌一起使用。在查看时我可以看到标头设置正确HttpContext.Request.Headers,但它似乎没有被解析。
这是在具有该属性的 Grpc 服务上设置的[Authorize]。
使用 ASP.NET Core 3.1,它运行得很好。我阅读了官方迁移指南,但他们有关授权的参考仅适用于 Azure Active Directory。
我正在使用 IdentityServer4,它托管在 ASP.NET Core 应用程序中作为中间件 ( app.UseIdentityServer();)
我忘记修改什么以使 ASP.NET Core 正确解析授权标头?
更新:
我更详细地检查了它,发现它失败了,因为它无法验证受众 ( aud) - 是的,在新创建的代币上,受众缺失(旧代币有受众)。我还注意到我添加了一个自定义范围
public override async Task GetProfileDataAsync(ProfileDataRequestContext context)
Run Code Online (Sandbox Code Playgroud)
在我的习惯里面
public class ProfileService : ProfileService<ApplicationUser>
Run Code Online (Sandbox Code Playgroud)
更新后也不见了。IdentityServer 的配置方式如下:
protected override Task HandleRequirementAsync(AuthorizationHandlerContext …Run Code Online (Sandbox Code Playgroud) asp.net-authorization jwt asp.net-core identityserver4 asp.net-core-5.0
asp.net-core ×6
c# ×5
jwt ×3
.net-core ×2
asp.net ×2
asp.net-mvc ×1
iis-7 ×1
oauth-2.0 ×1
post ×1
signalr ×1
typescript ×1